ããããŒã°ïŒå
éšã¯æ°ãããããªãã¯ã§ã
ç§ãã¡ã¯çããã¹ãŠãæ£ããè¡ããããããžã§ã¯ãã倢èŠãŠããŸããã ãšãŠãèªç¶ã«æããŸãã è¯ãã³ãŒããæžãããšã®å¯èœæ§ã«ã€ããŠç¥ããšããã«ãåãã³ãŒãã«ã€ããŠç°¡åã«èªãã ãä¿®æ£ãããã§ããäŒèª¬ãèããããšããã«ãããã§ããã«ç¹ç¯ããŸãã

ãã®ãããªãããžã§ã¯ãã¯ç§ã®äººçã§èµ·ãããŸããã ããäžã€ã ãããŠãç§ã¯ä»»æã®ç£ç£ã®äžã§ãããè¡ããŸãã ãããã£ãŠãç§ããããã£ãã ãã§ãªãããã¹ãŠãæ£ããããªããã°ãªããŸããã§ããã ãæ£ãããããšã®1ã€ã¯ããã«ãã»ã«åãå°éããæå€§éã«è¿ãããšã§ããåžžã«éãæéããããããéããã«ã¯é
ãããŸããã ãããã£ãŠãã§ããéãããããªãã¯ã§ã¯ãªãã¯ã©ã¹ã«å
éšã¢ã¯ã»ã¹ä¿®é£Ÿåã䜿çšãå§ããŸããã ãããŠãã¡ãããããªããæ°ããèšèªæ©èœãç©æ¥µçã«äœ¿çšãå§ãããšãããã€ãã®ãã¥ã¢ã³ã¹ãçããŸãã ãããã«ã€ããŠé çªã«ãç§ã¯äŒãããã§ãã
æ»æçãªåºæ¬ãã«ãæãåºãããŠã©ãã«ãä»ããã ãã§ãã
- ã¢ã»ã³ããªã¯ã.NETã§ã®å±éã®æå°åäœã§ãããåºæ¬çãªã³ã³ãã€ã«åäœã®1ã€ã§ãã çŸç¶ã§ã¯ã.dllãŸãã¯.exeã§ãã 圌ãã¯ãã¢ãžã¥ãŒã«ãšåŒã°ããããã€ãã®ãã¡ã€ã«ã«åå²ã§ãããšèšã£ãŠããŸãã
- public-ã¢ã¯ã»ã¹ä¿®é£Ÿåãããã¯ãããŒã¯ããããã¹ãŠã®ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããããšãæå³ããŸãã
- internal-ã¢ã¯ã»ã¹ä¿®é£Ÿåãã€ãŸããã¢ã»ã³ããªå
ã§ã®ã¿äœ¿çšå¯èœãšããŒã¯ãããŸãã
- protected-ããŒã¯ãããŠããã¯ã©ã¹ã®çžç¶äººã®ã¿ãã¢ã¯ã»ã¹ã§ããããã«ããŒã¯ãããŠããããšã瀺ãã¢ã¯ã»ã¹ä¿®é£Ÿåã
- private-é
眮ãããŠããã¯ã©ã¹ã§ã®ã¿äœ¿çšå¯èœãšããŒã¯ãããŠããããšã瀺ãã¢ã¯ã»ã¹ä¿®é£Ÿåã ãããŠèª°ãããªãã
åäœãã¹ããšãã¬ã³ããªãŒãã«ã
C ++ã§ã¯ããã¬ã³ããªãŒã¯ã©ã¹ã®ãããªå¥åŠãªæ©èœããããŸããã ã¯ã©ã¹ããã¬ã³ããšããŠå²ãåœãŠããšãã¯ã©ã¹éã®ã«ãã»ã«åã®å¢çãæ¶å»ãããŸããã ããã¯ãC ++ã§æãå¥åŠãªæ©èœã§ã¯ãªããšæãããŸãã ãããããæãå¥åŠãªããã10ãå«ãŸããŠããŸããã ããããããã€ãã®ã¯ã©ã¹ãç·å¯ã«ãªã³ã¯ããŠè¶³å
ãæã€ããšã¯ãã©ããããããç°¡åãããŠããã®æ©èœã«é©ããã±ãŒã¹ãèŠã€ããããšã¯éåžžã«å°é£ã§ãã
.NETã«ã¯ããã¬ã³ããªãŒãªã¢ã»ã³ããªããããäžçš®ã®åèãããããšãç¥ãã®ã¯ãããã«é©ãã¹ãããšã§ããã ã€ãŸããããã¢ã»ã³ããªã«ãå¥ã®ã¢ã»ã³ããªã®å
éšããã¯ã®åŸãã«é ããŠãããã®ã衚瀺ãããããšãã§ããŸãã ãããç¥ã£ããšããç§ã¯ããããé©ããŸããã ããŠãã©ã®ããã«ããªãã§ããïŒ ãã€ã³ãã¯äœã§ããïŒ åé¢ã«é¢ä¿ãã2ã€ã®ã¢ã»ã³ããªã誰ããã£ãããšãã€ã³ãããŸããïŒ äžå¯è§£ãªç¶æ³ã§å
¬éãããå Žåããã®èšäºã§ã¯èæ
®ããŸããã
ãããŠãåããããžã§ã¯ãã§ãç§ã¯æ¬ç©ã®saã®éã®åå²ã®1ã€ã§ãããŠããããã¹ããåŠã³å§ããŸããã ãŸãã颚氎ã§ã¯åäœãã¹ããå¥ã®ã¢ã»ã³ããªã§è¡ãå¿
èŠããããŸãã åã颚氎ã§ã¢ã»ã³ããªå
ã«é ãããšãã§ãããã¹ãŠã®ãã®ã«ã€ããŠã¯ãã¢ã»ã³ããªå
ã«é ãå¿
èŠããããŸãã ç§ã¯éåžžã«äžå¿«ãªéžæã«çŽé¢ããŸããã ãã¹ãã¯æšªã«äžŠãã§ãæçšãªã³ãŒããšäžç·ã«ã¯ã©ã€ã¢ã³ãã«éããããããã¹ãŠãããŒã¯ãŒãpublicã§ã«ããŒãããŸããããã¯ããã³ã湿ã£ãŠããæéã§ãã
ãããŠãããã§ãç§ã®èšæ¶ã®ã©ãããããå奜çãªéäŒã«ã€ããŠäœããåŸãããŸããã ã¢ã»ã³ã㪠"YourAssemblyName"ãããå Žåãæ¬¡ã®ããã«èšè¿°ã§ããããšãããããŸããã
[assembly: InternalsVisibleTo("YourAssemblyName.Tests")]
ãŸããã¢ã»ã³ããªãYourAssemblyName.Testsãã§ã¯ããYourAssemblyNameãã®å
éšããŒã¯ãŒãã§ããŒã¯ããããã®ã衚瀺ãããŸãã ãã®è¡ã¯ãAssemblyInfo.csã§å
¥åã§ããŸããAssemblyInfo.csã¯ãVSããã®ãããªå±æ§ãä¿åããããã«ç¹å¥ã«äœæããŸãã
èåŸ
ãåºæ¬çãªãã«ãã«æ»ã.NETã§ã¯ãæœè±¡ããããªãã¯ãå
éšãéçãªã©ã®æ¢ã«çµã¿èŸŒãŸããŠãã屿§ãããŒã¯ãŒãã«å ããŠãç¬èªã®å±æ§ãäœæã§ããŸãã ãããŠããã£ãŒã«ããããããã£ãã¯ã©ã¹ãã¡ãœãããã€ãã³ããã¢ã»ã³ããªå
šäœãªã©ãå¿
èŠãªãã®ã«ããããæããŸãã CïŒã§ã¯ããããè¡ãã«ã¯ãåçŽã«å±æ§åãè§ãã£ãã§å²ãã§èšè¿°ããŸãã ãã¢ã»ã³ããªã¯ããããå§ãŸãããšããã³ãŒãã®ã©ãã«ãçŽæ¥ç€ºãããŠããªããããäŸå€ã¯ã¢ã»ã³ããªèªäœã§ãã ããã§ã屿§åã®åã«ã¢ã»ã³ããªã远å ããŸãã
ãããã£ãŠããªãªã«ãã¯ãããããããŸãŸã§ãçŸã¯å®å
šã§ãããå¯èœãªãã®ã¯ãã¹ãŠã¢ã»ã³ããªå
ã«ãŸã é ããŠããŸãããŠããããã¹ãã¯æåŸ
ã©ããå¥ã®ã¢ã»ã³ããªã«äœãã§ãããç§ããããããŠæãåºããæ©èœã«ã¯ããã䜿çšããçç±ããããŸãã ããããå¯äžã®æ¢åã®çç±ã
ç§ã¯1ã€ã®éèŠãªç¹ãã»ãšãã©å¿ããŠããŸããã 屿§ã¢ã¯ã·ã§ã³InternalsVisibleToã¯äžæ¹åã§ãã
ä¿è·ãããŠãã<å
éšïŒ
ç¶æ³ïŒAãšBã¯ãã€ãã®äžã«åº§ã£ãŠããŸããã
using System; namespace Pipe { public class A { public String SomeProperty { get; protected set; } } internal class B {
Aã¯ã¢ã»ã³ããªã®å€éšã§äœ¿çšãããªããããã³ãŒãã¬ãã¥ãŒããã»ã¹ã§ç Žå£ãããŸããããäœããã®çç±ã§ãããªãã¯ã¢ã¯ã»ã¹ä¿®é£Ÿåãæã€ããšãã§ãããããBã¯ã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ãããæåã®æ°åéã§æ··ä¹±ã«é¥ãããšããããŸããã
åºæ¬çã«ããšã©ãŒã¡ãã»ãŒãžã¯è«ççã§ãã ããããã£ã¢ã¯ã»ãµãŒã¯ãããããã£èªäœãå
¬éããããšã¯ã§ããŸããã ã³ã³ãã€ã©ãããã«ããããŒãæäŸãããšã誰ã§ãçè§£ããŠåå¿ããŸãã
internal String OtherProperty { get; public set; }
ãããããã®è¡ã«å¯Ÿãã䞻匵ã¯ããã«è³ãç Žå£ããŸãïŒ
internal String OtherProperty { get; protected set; }
ãã®è¡ã«ã€ããŠäžæºã¯ãªãããšã«æ³šæããŠãã ããã
internal String OtherProperty { get; private set; }
ããèããªããã°ã次ã®éå±€ãé ã®äžã«æ§ç¯ãããŸãã
public > internal > protected > private
ãããŠããã®éå±€ã¯ããŸãæ©èœããŠããããã§ãã äžç®æãé€ããŸãã where internal> protectedã ã³ã³ãã€ã©ãŒã®äž»åŒµã®æ¬è³ªãçè§£ããããã«ãå
éšããã³ä¿è·ã«ãã£ãŠèª²ããããå¶éãæãåºããŸãããã å
éš-ã¢ã»ã³ããªå
éšã®ã¿ã ä¿è·-çžç¶äººã®ã¿ã çžç¶äººã«æ³šæããŠãã ããã ã¯ã©ã¹Bããããªãã¯ãšããŠããŒã¯ãããŠããå Žåãå¥ã®ã¢ã»ã³ããªã§ãã®åå«ãå®çŸ©ã§ããŸãã ãããŠãèšå®ãããã¢ã¯ã»ãµã¯ãããããã£å
šäœã«ååšããªãå Žæã«å®éã«ã¢ã¯ã»ã¹ããŸãã CïŒã³ã³ãã€ã©ã¯åŠæ³çã§ããããããã®ãããªå¯èœæ§ããèš±ãããšã¯ã§ããŸããã
åœŒã«æè¬ããŸãããç¶æ¿è
ã«ã¢ã¯ã»ãµãžã®ã¢ã¯ã»ã¹ãèš±å¯ããå¿
èŠããããŸãã ãããŠãç¹ã«ãã®ãããªå Žåã®ããã«ãä¿è·ãããå
éšã¢ã¯ã»ã¹ä¿®é£ŸåããããŸãã
ãã®ãã«ãã¯ããã»ã©äžå¿«ã§ã¯ãããŸãã- protected internal-ããŒã¯ããããã®ãã¢ã»ã³ããªå
ã§ã ãŸãã¯ããŒã¯ããããã®ãååšããã¯ã©ã¹ã®çžç¶äººãå©çšã§ããããšã瀺ãã¢ã¯ã»ã¹ä¿®é£Ÿåã
ãããã£ãŠãã³ã³ãã€ã©ã«ãã®ããããã£ã®äœ¿çšãèš±å¯ããçžç¶äººã«èšå®ããã«ã¯ããããè¡ãå¿
èŠããããŸãã
using System; namespace Pipe { internal class B { protected internal String OtherProperty { get; protected set; } } }
ãããŠãã¢ã¯ã»ã¹ä¿®é£Ÿåã®æ£ããéå±€ã¯æ¬¡ã®ããã«ãªããŸãã
public > protected internal > internal/protected > private
ã€ã³ã¿ãŒãã§ãŒã¹
ãããã£ãŠãç¶æ³ïŒAãIãBã¯ãã€ãã®äžã«åº§ã£ãŠããŸããã
namespace Pipe { internal interface I { void SomeMethod(); } internal class A : I { internal void SomeMethod() {
ç§ãã¡ã¯æ£ç¢ºã«åº§ã£ãŠãã¢ã»ã³ããªã®å€åŽã«å¹²æžããŸããã§ããã ãããããããã¯ã³ã³ãã€ã©ã«ãã£ãŠæåŠãããŸããã ããã§ãã¯ã¬ãŒã ã®æ¬è³ªã¯ãšã©ãŒã¡ãã»ãŒãžããæããã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã¯éããŠããå¿
èŠããããŸãã ã€ã³ã¿ãŒãã§ã€ã¹èªäœãéããŠããŠãã ã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£
ãžã®ã¢ã¯ã»ã¹ããã®å¯çšæ§ã«çµã³ä»ããããšã¯è«ççã§ãããããã§ã¯ãªããã®ã¯ããã§ã¯ãããŸããã ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã¯ãããªãã¯ã§ãªããã°ãªããŸããã
ãããŠã2ã€ã®æ¹æ³ããããŸãã æåïŒæ¯ã®ããã¿ãšæ¯ããããéããŠãã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã«ãããªãã¯ã¢ã¯ã»ã¹ä¿®é£ŸåãæããŸãã 2çªç®ïŒã€ã³ã¿ãŒãã§ã€ã¹ã®æç€ºçãªå®è£
ã æ¬¡ã®ããã«ãªããŸãã
namespace Pipe { internal interface I { void SomeMethod(); } internal class A : I { public void SomeMethod() { } } internal class B : I { void I.SomeMethod() { } } }
2çªç®ã®å Žåãã¢ã¯ã»ã¹ä¿®é£Ÿåã¯ãããŸããã ãã®å Žåãã¡ãœããã®å®è£
ã¯èª°ã«å©çšå¯èœã§ããïŒ èª°ãèšããªãããã«ããŸãããã äŸã§è¡šç€ºããæ¹ãç°¡åã§ãïŒ
B b = new B();
ã€ã³ã¿ãŒãã§ã€ã¹Iã®æç€ºçãªå®è£
ãšã¯ã倿°ãã¿ã€ãIã«æç€ºçã«ãã£ã¹ããããŸã§ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã¡ãœããããªãããšãæå³ããŸãã ïŒb as IïŒ.SomeMethodïŒïŒãæžããã³ã«ãªãŒããŒããŒãã«ãªãå¯èœæ§ããããŸãã LikeïŒïŒIïŒbïŒ.SomeMethodïŒïŒã ãããŠãç§ã¯ãããåé¿ãã2ã€ã®æ¹æ³ãèŠã€ããŸããã ç§ã¯èªåã®ããšãèããæ£çŽã«ã°ãŒã°ã«ã§ã°ãŒã°ã«ã§æ€çŽ¢ããŸããã
æåã®æ¹æ³ã¯å·¥å Žã§ãïŒ
internal class Factory { internal I Create() { return new B(); } }
ããŠããŸãã¯ãã®ãã¥ã¢ã³ã¹ãé ãããšãã§ããä»ã®ãã¿ãŒã³ã
æ¹æ³2-æ¡åŒµã¡ãœããïŒ
internal static class IExtensions { internal static void SomeMethod(this I i) { i.SomeMethod(); } }
é©ãã¹ãããšã«ãããã¯åäœããŸãã æ¬¡ã®è¡ã¯ãšã©ãŒã®ã¹ããŒã忢ããŸãã
B b = new B(); b.SomeMethod();
IntelliSenseãVisual Studioã§ãã€ã³ã¿ãŒãã§ã€ã¹ãæç€ºçã«å®è£
ããã¡ãœããã§ã¯ãªããæ¡åŒµã¡ãœããã«äŒããããã«ãåŒã³åºããè¡ãããŸãã ãããŠèª°ã圌ãã«ç«ã¡åããããšãçŠããŸããã ãŸããã€ã³ã¿ãŒãã§ãŒã¹æ¡åŒµã¡ãœããã¯ããã®ãã¹ãŠã®å®è£
ã§åŒã³åºãããšãã§ããŸãã
ãã ãã1ã€æ³šæç¹ããããŸãã ã¯ã©ã¹èªäœã®å
éšã§ã¯ãthisããŒã¯ãŒããä»ããŠãã®ã¡ââãœããã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸããããããªããšãã³ã³ãã€ã©ã¯æ¡åŒµã¡ãœãããåç
§ããå¿
èŠãããããšãçè§£ã§ããŸããã
internal class B : I { internal void OtherMethod() {
ãã®ããããããã¹ãã§ã¯ãªãå Žæã«ãããªãã¯ãŸãã¯ãããªãã¯ããããŸãããããã«ã¯å®³ããªããåå
éšã€ã³ã¿ãŒãã§ã€ã¹ã«å°ãäœåãªã³ãŒããå«ãŸããŠããããã§ãã ããªãã®å¥œã¿ã«åãããŠå°ããªæªãéžæããŠãã ããã
ãªãã¬ã¯ã·ã§ã³
ãªãã¬ã¯ã·ã§ã³ã䜿çšããŠã³ã³ã¹ãã©ã¯ã¿ãŒãèŠã€ããããšãããšãã«ãããã¯çãæããããŸããããã¡ãããå
éšã¯ã©ã¹ã§å
éšãšããŠããŒã¯ãããŠããŸããã ãããŠããªãã¬ã¯ã·ã§ã³ã¯å
¬éãããªããã®ãäœãæäŸããªãããšã倿ããŸããã ãããŠãããã¯ååãšããŠè«ççã§ãã
ãŸããçèããŸããè³¢ã人ãè³¢ãæ¬ã«æžããããšãæ£ããèŠããŠããã°ãããã¯ã¢ã»ã³ããªã¡ã¿ããŒã¿ã§æ
å ±ãèŠã€ããããšã§ãã çè«çã«ã¯ãããã¯ããŸãã«ãå€ããäžããã¹ãã§ã¯ãããŸããïŒå°ãªããšãããã¯æããŸããïŒã 第äºã«ããªãã¬ã¯ã·ã§ã³ã®äž»ãªçšéã¯ãããã°ã©ã ãæ¡åŒµå¯èœã«ããããšã§ãã ããªãã¯éšå€è
ã«ããçš®ã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãïŒããããã€ã³ã¿ãŒãã§ãŒã¹ã®åœ¢ã§ãããfiy-haïŒïŒã ãããŠã圌ãã¯ãããå®è£
ãããã©ã°ã€ã³ãMODãæ¡åŒµæ©èœãå€åºå
ã§ããŒããããã¢ã»ã³ããªã®åœ¢ã§æäŸãããããããªãã¬ã¯ã·ã§ã³ãããããååŸããŸãã ãããŠãããèªäœã§ãAPIã¯å
¬éãããŸãã ã€ãŸããåå°ãéããŠå
éšãèŠãããšã¯ãå®çšçãªèгç¹ããã¯æè¡çã«ãç¡æå³ã§ããããŸããã
æŽæ°ãã ããã®ã³ã¡ã³ãã§ã¯ãæç€ºçã«èŠæ±ããå Žåãäžè¬çã«ãã¹ãŠãåæ ããããšãã§ããŸãã 瀟å
ã§ãããã©ã€ããŒãã§ãã äœããã®ã³ãŒãåæããŒã«ãäœæããŠããªãå Žåã¯ãããããªãããã«ããŠãã ããã 以äžã®ããã¹ãã¯ãæªè§£æ±ºã®ã¡ã³ããŒã¿ã€ããæ¢ããŠããå Žåã«é¢é£ããŠããŸãã ãããŠäžè¬çã«ãã³ã¡ã³ããæž¡ããªãã§ãã ãããå€ãã®è峿·±ãããšããããŸãã
ããã¯ãªãã¬ã¯ã·ã§ã³ã§çµäºããããšãã§ããŸããããAãIãBããã€ãã«åº§ã£ãŠããåã®äŸã«æ»ããŸãããã
namespace Pipe { internal interface I { void SomeMethod(); } internal static class IExtensions { internal static void SomeMethod(this I i) { i.SomeMethod(); } } internal class A : I { public void SomeMethod() { } internal void OtherMethod() { } } internal class B : I { internal void OtherMethod() { } void I.SomeMethod() { } } }
ã¯ã©ã¹Aã®äœæè
ã¯ãå
éšã¯ã©ã¹ã®ã¡ãœããããããªãã¯ãšããŠããŒã¯ãããŠããã°ãã³ã³ãã€ã©ãŒãèŠçãæããªãããã«ããã³ãŒããããããããå¿
èŠããªãå Žåãäœãæªãããšã¯ãªããšå€æããŸããã ã€ã³ã¿ãŒãã§ã€ã¹ã¯å
éšãšããŠããŒã¯ããããããå®è£
ããã¯ã©ã¹ã¯å
éšãšããŠããŒã¯ãããå€éšããã¯ããããªãã¯ãšããŠããŒã¯ãããã¡ãœããã«å°éããæ¹æ³ããªãããã§ãã
ãããŠãã¢ãéããåå°ãéãã«æœå
¥ããŸãã
using Pipe; using System; using System.Reflection; namespace EncapsulationTest { public class Program { public static void Main(string[] args) { FindThroughReflection(typeof(I), "SomeMethod"); FindThroughReflection(typeof(IExtensions), "SomeMethod"); FindThroughReflection(typeof(A), "SomeMethod"); FindThroughReflection(typeof(A), "OtherMethod"); FindThroughReflection(typeof(B), "SomeMethod"); FindThroughReflection(typeof(B), "OtherMethod"); Console.ReadLine(); } private static void FindThroughReflection(Type type, String methodName) { MethodInfo methodInfo = type.GetMethod(methodName); if (methodInfo != null) Console.WriteLine($"In type {type.Name} we found {methodInfo}"); else Console.WriteLine($"NULL! Can't find method {methodName} in type {type.Name}"); } } }
å¿
èŠã«å¿ããŠããã®ã³ãŒããç ç©¶ããã¹ã¿ãžãªã«éã蟌ã¿ãŸãã ããã§ã¯ããªãã¬ã¯ã·ã§ã³ã䜿çšããŠããã¹ãŠã®çš®é¡ã®ãã€ãïŒåå空éPipeïŒãããã¹ãŠã®ã¡ãœãããèŠã€ããŠã¿ãŸãã ãããŠãããã¯ç§ãã¡ã«äžããçµæã§ãïŒ
ã¿ã€ãIã§ã¯ãVoid SomeMethodïŒïŒãèŠã€ãããŸãã
NULLïŒ IExtensionsåã«ã¡ãœããSomeMethodãèŠã€ãããŸãã
ã¿ã€ãAã§Void SomeMethodïŒïŒãèŠã€ãããŸãã
NULLïŒ ã¿ã€ãAã«ã¡ãœããOtherMethodãèŠã€ãããŸãã
NULLïŒ ã¿ã€ãBã«ã¡ãœããSomeMethodãèŠã€ãããŸãã
NULLïŒ ã¿ã€ãBã«ã¡ãœããOtherMethodãèŠã€ãããŸãã
MethodInfoåã®ãªããžã§ã¯ãã䜿çšãããšãèŠã€ãã£ãã¡ãœãããåŒã³åºãããšãã§ãããšããã«èšããªããã°ãªããŸããã ã€ãŸããåå°ãäœããèŠã€ããå ŽåãçŽç²ã«çè«çã«ã«ãã»ã«åã«éåããå¯èœæ§ããããŸãã ãããŠãäœããèŠã€ãããŸããã æåã«ãã¯ã©ã¹Aããã®åãpublic void SomeMethodïŒïŒãããã¯ãä»ã«äœãèšãã®ããäºæ³ãããŠããŸããã ãã®è²æ©ã¯ãŸã çµæããããããããããŸããã æ¬¡ã«ãã€ã³ã¿ãŒãã§ãŒã¹Iã®SomeMethodïŒïŒãç¡å¹ã«ããŸããããã¯ãã§ã«è峿·±ããã®ã§ãã ã©ã®ããã«ããã¯ã¢ããããŠããã€ã³ã¿ãŒãã§ã€ã¹ã«é
眮ãããæœè±¡ã¡ãœããïŒãŸãã¯CLRãå®éã«ããã«é
眮ãããã®ïŒã¯å®éã«ã¯éããŠããŸãã ãããã£ãŠãå¥ã®æ®µèœã§çµè«ãäžãããŸãã
ã©ã®ã¿ã€ãã®System.Typeã¿ã€ããé
åžããããæ³šææ·±ãèŠãŠãã ããã
ããããããã2ã€ã®æ¹æ³ã«ã¯ãã1ã€åŸ®åŠãªéãããããŸãã®ã§ãæ€èšããããšæããŸãã å
éšã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœãããšå
éšã¯ã©ã¹ã®ãããªãã¯ã¡ãœããã¯ããªãã¬ã¯ã·ã§ã³ã䜿çšããŠèŠã€ããããšãã§ããŸãã åççãªäººãšããŠãç§ã¯åœŒããã¡ã¿ããŒã¿ã«è©²åœãããšçµè«ä»ããŸãã çµéšè±å¯ãªäººãšããŠãç§ã¯ãã®çµè«ãæ€èšŒããŸãã ILDasmã¯ãããæ¯æŽããŸãã
ãã€ãã®ã¡ã¿ããŒã¿ã®ãŠãµã®ã®ç©ŽãèŠããŠã¿ãŠãã ããã¢ã»ã³ããªã¯ãªãªãŒã¹ã§çµã¿ç«ãŠãããŸãã
TypeDef #2 (02000003)
-------------------------------------------------------
TypDefName: Pipe.I (02000003)
Flags : [NotPublic] [AutoLayout] [Interface] [Abstract] [AnsiClass] (000000a0)
Extends : 01000000 [TypeRef]
Method #1 (06000004)
-------------------------------------------------------
MethodName: SomeMethod (06000004)
Flags : [Public] [Virtual] [HideBySig] [NewSlot] [Abstract] (000005c6)
RVA : 0x00000000
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
TypeDef #3 (02000004)
-------------------------------------------------------
TypDefName: Pipe.IExtensions (02000004)
Flags : [NotPublic] [AutoLayout] [Class] [Abstract] [Sealed] [AnsiClass] [BeforeFieldInit] (00100180)
Extends : 01000011 [TypeRef] System.Object
Method #1 (06000005)
-------------------------------------------------------
MethodName: SomeMethod (06000005)
Flags : [Assem] [Static] [HideBySig] [ReuseSlot] (00000093)
RVA : 0x00002134
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
ReturnType: Void
1 Arguments
Argument #1: Class Pipe.I
1 Parameters
(1) ParamToken : (08000004) Name : i flags: [none] (00000000)
CustomAttribute #1 (0c000011)
-------------------------------------------------------
CustomAttribute Type: 0a000001
CustomAttributeName: System.Runtime.CompilerServices.ExtensionAttribute :: instance void .ctor()
Length: 4
Value : 01 00 00 00 > <
ctor args: ()
CustomAttribute #1 (0c000010)
-------------------------------------------------------
CustomAttribute Type: 0a000001
CustomAttributeName: System.Runtime.CompilerServices.ExtensionAttribute :: instance void .ctor()
Length: 4
Value : 01 00 00 00 > <
ctor args: ()
TypeDef #4 (02000005)
-------------------------------------------------------
TypDefName: Pipe.A (02000005)
Flags : [NotPublic] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit] (00100000)
Extends : 01000011 [TypeRef] System.Object
Method #1 (06000006)
-------------------------------------------------------
MethodName: SomeMethod (06000006)
Flags : [Public] [Final] [Virtual] [HideBySig] [NewSlot] (000001e6)
RVA : 0x0000213c
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
Method #2 (06000007)
-------------------------------------------------------
MethodName: OtherMethod (06000007)
Flags : [Assem] [HideBySig] [ReuseSlot] (00000083)
RVA : 0x0000213e
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
Method #3 (06000008)
-------------------------------------------------------
MethodName: .ctor (06000008)
Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886)
RVA : 0x00002140
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
InterfaceImpl #1 (09000001)
-------------------------------------------------------
Class : Pipe.A
Token : 02000003 [TypeDef] Pipe.I
TypeDef #5 (02000006)
-------------------------------------------------------
TypDefName: Pipe.B (02000006)
Flags : [NotPublic] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit] (00100000)
Extends : 01000011 [TypeRef] System.Object
Method #1 (06000009)
-------------------------------------------------------
MethodName: OtherMethod (06000009)
Flags : [Assem] [HideBySig] [ReuseSlot] (00000083)
RVA : 0x00002148
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
Method #2 (0600000a)
-------------------------------------------------------
MethodName: Pipe.I.SomeMethod (0600000A)
Flags : [Private] [Final] [Virtual] [HideBySig] [NewSlot] (000001e1)
RVA : 0x0000214a
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
Method #3 (0600000b)
-------------------------------------------------------
MethodName: .ctor (0600000B)
Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886)
RVA : 0x0000214c
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
MethodImpl #1 (00000001)
-------------------------------------------------------
Method Body Token : 0x0600000a
Method Declaration Token : 0x06000004
InterfaceImpl #1 (09000002)
-------------------------------------------------------
Class : Pipe.B
Token : 02000003 [TypeDef] Pipe.I
ã¯ã€ãã¯ã€ã³ã¹ãã¯ã·ã§ã³ã«ãããã©ã®ããã«ããŒã¯ãããŠããŠãã ãã¹ãŠãã¡ã¿ããŒã¿ã«å«ãŸããŠããããšãããããŸãã ãªãã¬ã¯ã·ã§ã³ã¯ãéšå€è
ãèŠãã¹ãã§ã¯ãªããã®ããŸã æ
éã«é ããŠããŸãã ãããã£ãŠãå
éšã€ã³ã¿ãŒãã§ã€ã¹ã®åã¡ãœããã®äœåãª5è¡ã®ã³ãŒãã¯ãããã»ã©å€§ããªæªã§ã¯ãªããããããŸããã ãã ããäž»ãªçµè«ã¯åããŸãŸã§ãã
ã©ã®ã¿ã€ãã®System.Typeã¿ã€ããé
åžããããæ³šææ·±ãèŠãŠãã ããã
ããããããã¯ãã¡ããããããªãã¯ã®å¿
èŠããªããã¹ãŠã®å Žæã§ããŒã¯ãŒãinternalãååŸããåŸã®æ¬¡ã®ã¬ãã«ã§ãã
PS
internalããŒã¯ãŒãã䜿çšããããšã§æãã¯ãŒã«ãªããšã¯ãã¢ã»ã³ããªå
ã®ã©ãã«ã§ãããããšãç¥ã£ãŠããŸããïŒ å€§ãããªã£ããã2ã€ä»¥äžã«åå²ããå¿
èŠããããŸãã ãããŠãã®éçšã§ãããã€ãã®ã¿ã€ãããªãŒãã³ã«ããããã«äŒæ©ãåãå¿
èŠããããŸãã ãããŠãã©ã®ã¿ã€ãããªãŒãã³ã«ãªãã®ã«ãµããããã®ããæ£ç¢ºã«èããå¿
èŠããããŸãã å°ãªããšãç°¡åã«ã
ããã¯ã次ã®ããšãæå³ããŸãã ãã®ã³ãŒãã®äœææ¹æ³ã«ãããæ°çå
ã®ã¢ã»ã³ããªéã®ã¢ãŒããã¯ãã£ã®å¢çãã©ã®ãããªåœ¢ã«ãªãããåèã§ããŸãã ãã£ãšçŸãããã®ã¯ãããŸããïŒ
PPS
ããŒãžã§ã³CïŒ7.2ãããæ°ãããã©ã€ããŒãä¿è·ã¢ã¯ã»ã¹ä¿®é£Ÿåãç»å ŽããŸããã ãããŠãç§ã¯ãŸã ãããäœã§ãäœãšäžç·ã«é£ã¹ãããã®ãåãããŸããã å®éã«ã¯åºäŒããªãã®ã§ã ããããç§ã¯ã³ã¡ã³ãã§ç¥ã£ãŠããããã§ãã ãã ããããã¥ã¡ã³ãããã³ããŒã¢ã³ãããŒã¹ãããã®ã§ã¯ãªããå®éã«ãã®ã¢ã¯ã»ã¹ä¿®é£Ÿåãå¿
èŠã«ãªãå ŽåããããŸãã