å
é±ã®æææ¥ãç§ã¯å¹žéãªããšã«ãããåœéäŒæ¥ã®ã·ãã¢.Netéçºè
ã®ã€ã³ã¿ãã¥ãŒãåããŸããã ã€ã³ã¿ãã¥ãŒäžã«ã.Netã«é¢é£ããããã€ãã®è³ªåããããã¹ããåããããã«é ŒãŸããŸããã ç¹ã«ã質åã®1ã€ã§ã¯ãããã€ãã®ã¹ããŒãã¡ã³ãã®è©äŸ¡ïŒtrue / falseïŒãè¡ãå¿
èŠããããŸããã
.Netã§ã¯ãint []ãªã©ã®èŠçŽ ã®é
åã¯ããã©ã«ãã§IListãå®è£
ããŸããããã«ãããforeachã¹ããŒãã¡ã³ãã§ã³ã¬ã¯ã·ã§ã³ãšããŠäœ¿çšã§ããŸãã
ãã®è³ªåã«ãã°ããåŠå®çã«çããããŒãžã³ãåå¥ã«è¿œå ããŸãã foreachã«ã¯IListã§ã¯ãªãIEnumerableã®å®è£
ãå¿
èŠã§ããããã次ã®è³ªåã«é²ã¿ãŸããã ããããåž°ãéã§ãç§ã¯è³ªåã«èŠãããããŸããïŒé
åã¯ãŸã ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠããŸããïŒ
IListã«ã€ããŠããã®ã€ã³ã¿ãŒãã§ã€ã¹ãIEnumerableãã€ã³ãã¯ãµãŒãã³ã¬ã¯ã·ã§ã³å
ã®èŠçŽ ã®æ°ãå«ãCountããããã£ãããã³IsFixedCollectionïŒïŒãªã©ã®ãã£ãã«äœ¿çšãããªãããããã£ãæäŸããããšãæŒ ç¶ãšæãåºããŸããã é
åã«ã¯ãµã€ãºã®Lengthããããã£ããããIEnumerableã®Countã¯LINQã®æ¡åŒµã¡ãœããã§ããããã®ã¡ãœãããã¯ã©ã¹ã«å®è£
ãããŠããå Žåã¯äžå¯èœã§ãã ãããã£ãŠãé
åãIListã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ã§ããªãã£ãããšãå€æããŸããããæŒ ç¶ãšããæ°æã¡ã«æ©ãŸãããŸããã ãããã£ãŠãã€ã³ã¿ãã¥ãŒåŸã®å€æ¹ãç§ã¯å°ã調æ»ããããšã«ããŸããã
ã¯ã©ã¹System.Array
Reflector.Netã¯ã€ã³ã¹ããŒã«ãããŠããªããããæŽæ°é
åã«ãã£ãŠå®è£
ãããã€ã³ã¿ãŒãã§ã€ã¹ã調ã¹ãããã®çãããã°ã©ã ãCïŒã§äœæããŸããã
var v = new int[] { 1, 2, 3 }; var t = v.GetType(); var i = t.GetInterfaces(); foreach(var tp in i) Console.WriteLine(tp.Name);
ã³ã³ãœãŒã«ãŠã£ã³ããŠããåä¿¡ããã€ã³ã¿ãŒãã§ã€ã¹ã®å®å
šãªãªã¹ãã¯æ¬¡ã®ãšããã§ãã
ICloneable IList ICollection IEnumerable IStructuralComparable IStructuralEquatable IList`1 ICollection`1 IEnumerable`1 IReadOnlyList`1 IReadOnlyCollection`1
ãããã£ãŠã
.Netã®
é
åã¯ãIListã€ã³ã¿ãŒãã§ã€ã¹ãšãã®æ±çšããŒãžã§ã³ã®IList <>ããŸã å®è£
ããŠããŸã ã
ããå®å
šãªæ
å ±ãååŸããããã«ãSystem.Arrayã¯ã©ã¹ã®å³ãäœæããŸããã

ç§ã®ãã¹ã¯ããã«ç§ã襲ããŸããïŒCountã¯IListã®ããããã£ã§ã¯ãªããç¶æ¿ãã§ãŒã³ã®ä»¥åã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ããICollectionã§ãã ãã ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ä»ã®ããããã£IsFixedSizeããã³IsReadOnlyãå®è£
ãããŠããã«ãããããããé
åèªäœã«ã¯IListã€ã³ã¿ãŒãã§ã€ã¹ã®ä»ã®å€ãã®ããããã£ã»ã©ã®ããããã£ã¯ãŸã ãããŸããã§ããã ããã¯ã©ã®ããã«å¯èœã§ããïŒ
CïŒã§ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ã§ããã ãã§ãªãã
æé»çã§ãããæ瀺çã«ãã ç§ã¯æç§æžãããã®å¯èœæ§ã«ã€ããŠç¥ã£ãŠããŸãããããã¯ãã®ãããªå®è£
ã®äŸã瀺ããŸããã åºæ¬ã¯ã©ã¹ã«æ¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœãããšåãååã®ã¡ãœãããå«ãŸããŠããå Žåã ReSharperã§ããã®ãããªæ©äŒãèŠãŸããã ãã ãããããŸã§ã®ãšãããèªåã®ãããžã§ã¯ãã«æ瀺çã«ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå¿
èŠæ§ã«çŽæ¥å¯ŸåŠããå¿
èŠã¯ãããŸããã§ããã
ã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çå®è£
ãšæé»çå®è£
ã®æ¯èŒ
ããã2çš®é¡ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ãæ¯èŒããŠã¿ãŸãããã
åºæº
| æé»çãªå®è£
| æ瀺çãªå®è£
|
---|
åºæ¬çãªæ§æ
| interface ITest { void DoTest(); } public class ImplicitTest : ITest { public void DoTest() { } }
| interface ITest { void DoTest(); } public class ExplicitTest : ITest { void ITest.DoTest() { } }
|
å¯èŠæ§
| æé»çãªå®è£
ã¯åžžã«ãããªãã¯ã§ãããããã¡ãœãããšããããã£ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã
var imp = new ImplicitTest(); imp.DoTest();
| æ瀺çãªå®è£
ã¯åžžã«éããããŠããŸãïŒãã©ã€ããŒãïŒã å®è£
ã«ã¢ã¯ã»ã¹ããã«ã¯ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ã¹ãããå¿
èŠããããŸãïŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¢ãããã£ã¹ãïŒã
var exp = new ExplicitTest(); ((ITest)exp).DoTest();
|
å€æ
æ§
| æé»çãªã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã¯ä»®æ³ã«ããããšãã§ããŸããããã«ãããåå«ã¯ã©ã¹ã§ãã®å®è£
ãæžãæããããšãã§ããŸãã
| æ瀺çãªå®è£
ã¯åžžã«éçã§ãã æ°ããåå«ã¯ã©ã¹ã§ãªãŒããŒã©ã€ããŸãã¯ãªãŒããŒã©ã€ãããããšã¯ã§ããŸããã ã泚æ 1
|
æœè±¡ã¯ã©ã¹ãšå®è£
| æé»ã®å®è£
ã¯æœè±¡çã§ãããåå«ã¯ã©ã¹ã§ã®ã¿å®è£
ã§ããŸãã
| æ瀺çãªå®è£
ã¯æœè±¡çã§ã¯ãªããããããŸããããã¯ã©ã¹èªäœã¯ä»ã®æœè±¡ã¡ãœãããæã¡ãæœè±¡çã§ãããããããŸããã ã泚æ 2
|
泚ïŒ
ã泚æ 1 -
mayorovpãã³ã¡ã³ãã§æ£ãã芳å¯ããŠããããã«ãåå«ã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çãªå®è£
ãç¹°ãè¿ããŠå®è£
ããªãŒããŒã©ã€ãã§ããŸãïŒèšäºã®æåã®ã³ã¡ã³ããåç
§ïŒã
ã泚æ 2- ããã°ã®1ã€ã¯ãã¯ã©ã¹èªäœãæœè±¡åã§ããªãããšã瀺ããŸããã ããããããã¯ã以åã®ããŒãžã§ã³ã®ã³ã³ãã€ã©ã®ããã€ãã«åœãŠã¯ãŸããŸãããç§ã®å®éšã§ã¯ãæœè±¡ã¯ã©ã¹ã§æ瀺çã«ã€ã³ã¿ãŒãã§ã€ã¹ãç°¡åã«å®è£
ã§ããŸããã
ãªãã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çãªå®è£
ãå¿
èŠãªã®ã§ããïŒ
MSDNã«ãããšãã¯ã©ã¹ã«ãã£ãŠå®è£
ãããè€æ°ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«åãã·ã°ããã£ãæã€ã¡ãœãããããå Žåãæ瀺çãªã€ã³ã¿ãŒãã§ã€ã¹å®è£
ãå¿
èŠã§ãã ãã®åé¡ã¯ãäžè¬çã«è±èªåã§ã¯
ãæ»ã®èŽåœçãªãã€ã€ã¢ã³ãããšããæãããååã§ç¥ãããŠããããã·ã¢èªã§ã¯
ããã€ã€ã¢ã³ãã®åé¡ããšèš³ãããŠããŸãã ãã®ãããªç¶æ³ã®äŸã次ã«ç€ºããŸãã
interface IJogger { void Run(); } interface ISkier { void Run(); } public class Athlete: ISkier, IJogger { public void Run() { Console.WriteLine("Am I an Athlete, Skier or Jogger?"); } }
ã¡ãªã¿ã«ããã®äŸã¯CïŒã®æ£ããã³ãŒãã§ããã€ãŸããïŒæ£ããïŒã³ã³ãã€ã«ãããŠèµ·åãããŸãããRunïŒïŒã¡ãœããã¯ã¯ã©ã¹èªäœã®ã¡ãœããã§ããããã§ã«2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã§ãã ãããã£ãŠãç°ãªãã€ã³ã¿ãŒãã§ã€ã¹ãšã¯ã©ã¹èªäœã«å¯ŸããŠ1ã€ã®å®è£
ã䜿çšã§ããŸãã 次ã®ã³ãŒãã§ããã確èªã§ããŸãã
var sp = new Athlete(); sp.Run(); (sp as ISkier).Run(); (sp as IJogger).Run();
ãã®ã³ãŒãã®çµæã¯
ãã¢ã¹ãªãŒããã¹ããŒã€ãŒããžã§ã¬ãŒã§ããïŒããšãªããã³ã³ãœãŒã«ã«3å
衚瀺ãããŸãã
ããã§ã3ã€ã®ã±ãŒã¹ãã¹ãŠãåé¢ããããã«ãã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çãªå®è£
ã䜿çšã§ããŸãã
public class Sportsman { public virtual void Run() { Console.WriteLine("I am a Sportsman"); } } public class Athlete: Sportsman, ISkier, IJogger { public override void Run() { Console.WriteLine("I am an Athlete"); } void ISkier.Run() { Console.WriteLine("I am a Skier"); } void IJogger.Run() { Console.WriteLine("I am a Jogger"); } }
ãã®å Žåããªã¹ã2ã®ã³ãŒããå®è¡ãããšãã³ã³ãœãŒã«ã«
ãç§ã¯ã¢ã¹ãªãŒãã ã
ãç§ã¯ã¹ããŒã€ãŒã ã
ãç§ã¯ãžã§ã¬ãŒããšãã 3è¡ã衚瀺ãããŸãã
ããŸããŸãªã€ã³ã¿ãŒãã§ã€ã¹å®è£
ã®é·æãšçæ
å®è£
ã®å¯èŠæ§ãšã«ã¹ã¿ã å®è£
äžèšã®ããã«ãæé»ã®å®è£
ã¯éåžžã®ã¯ã©ã¹ã¡ãœãããšæ§æçã«éãã¯ãããŸããïŒãã®ã¡ãœãããç¥å
ã¯ã©ã¹ã§æ¢ã«å®çŸ©ãããŠããå Žåããã®æ§æã§ã¯ã¡ãœããã¯åå«ã§é衚瀺ã«ãªããã³ãŒãã¯åé¡ãªãã³ã³ãã€ã«ãããŸãcã¡ãœããã®é衚瀺ã«é¢ããã³ã³ãã€ã©èŠåãïŒã ããã«ã1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®åã
ã®ã¡ãœããã®éžæçãªå®è£
ã¯ãæ瀺çããã³æé»çã«å¯èœã§ãã
public class Code { public void Run() { Console.WriteLine("I am a class method"); } } interface ICommand { void Run(); void Execute(); } public class CodeCommand : Code, ICommand {
ããã«ãããåå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã®å®è£
ããã€ãã£ãã¯ã©ã¹ã¡ãœãããšããŠäœ¿çšã§ãã察å¿ããã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ã¹ãããåŸã«ã®ã¿ãã©ã€ããŒãã§è¡šç€ºãããã¡ãœããã®æ瀺çãªå®è£
ãšã¯å¯Ÿç
§çã«ãããšãã°IntelliSenseãä»ããŠäœ¿çšã§ããŸãã
äžæ¹ãã¡ãœããã®ãã©ã€ããŒãå®è£
ã®å¯èœæ§ã«ãããå®å
šã«å®è£
ããªããå€ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœãããé ãããšãã§ããŸãã .Netã®é
åã䜿çšããæåã®äŸã«æ»ããšãé
åã¯ãããšãã°ICollectionã€ã³ã¿ãŒãã§ã€ã¹ã®Countããããã£ã®å®è£
ãé ãããã®ããããã£ãLengthãšããååã§å
¬éããŠããããšãããããŸãïŒããã¯ããããC ++ STLããã³Javaãšã®äºææ§ãç¶æããããã®è©Šã¿ã§ãïŒã ãããã£ãŠãå®è£
ãããã€ã³ã¿ãŒãã§ã€ã¹ã®ç¹å®ã®ã¡ãœãããé衚瀺ã«ããä»ã®ã¡ãœãããé衚瀺ïŒ=å
¬éïŒã«ããããšã¯ã§ããŸããã
ãã ãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¡ãœãããããããã£ãIntelliSenseã§è¡šç€ºãããªããããå€ãã®å Žåãã¯ã©ã¹ã«ãã£ãŠå®è£
ãããã€ã³ã¿ãŒãã§ã€ã¹ããæé»çã«ãæšæž¬ããããšã¯å®å
šã«äžå¯èœã§ãããšããåé¡ãçºçããŸãïŒSystem.Arrayã®äŸãããã«ç€ºããŸãïŒã ãã®ãããªå®è£
ãæ€åºããå¯äžã®æ¹æ³ã¯ãããšãã°Visual Studioã®ãªããžã§ã¯ããã©ãŠã¶ãŒã䜿çšããŠããªãã¬ã¯ã·ã§ã³ã䜿çšããããšã§ãã
ã€ã³ã¿ãŒãã§ã€ã¹ãªãã¡ã¯ã¿ãªã³ã°
ã€ã³ã¿ãŒãã§ã€ã¹ã®æé»çãªïŒãããªãã¯ïŒå®è£
ã¯ããããªãã¯ã¯ã©ã¹ã¡ãœããã®å®è£
ãšå€ãããªããããã€ã³ã¿ãŒãã§ã€ã¹ããªãã¡ã¯ã¿ãªã³ã°ãããããªãã¯ã¡ãœãããåé€ããå ŽåïŒããšãã°ãäžèšã®ICommandã€ã³ã¿ãŒãã§ã€ã¹ããRunïŒïŒããã³ExecuteïŒïŒã¡ãœããã1ã€ã®RunïŒ ïŒïŒãã¹ãŠã®æé»çãªå®è£
ã§ã¯ããªãŒãã³ã¢ã¯ã»ã¹ã¡ãœãããæ®ããŸãããã®ãããªãã¯ã¡ãœããã¯ãã·ã¹ãã ã®ä»ã®ã³ã³ããŒãã³ãã§ãã§ã«ç°ãªãäŸåé¢ä¿ãæã£ãŠããå¯èœæ§ãããããããªãã¡ã¯ã¿ãªã³ã°åŸã§ããµããŒãããå¿
èŠãããããã§ãã ãã®çµæã以åã®ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã®ç¹å®ã®ïŒããã³ç°ãªãã¯ã©ã¹ãããããç°ãªãïŒå®è£
éã§äŸåé¢ä¿ãæ¢ã«ååšããããããå®è£
ã§ã¯ãªãã€ã³ã¿ãŒãã§ã€ã¹ã«å¯ŸããŠããšããããã°ã©ãã³ã°ååã«éåããŸãã
interface IFingers { void Thumb(); void IndexFinger();
ã€ã³ã¿ãŒãã§ã€ã¹ã®ãã©ã€ããŒãå®è£
ã®å Žåãããååšããªãã¡ãœããã®æ瀺çãªå®è£
ãæã€ãã¹ãŠã®ã¯ã©ã¹ã¯åã«ã³ã³ãã€ã«ãåæ¢ããŸãããäžèŠã«ãªã£ãå®è£
ãåé€ããåŸïŒãŸãã¯æ°ããã¡ãœããã«ãªãã¡ã¯ã¿ãªã³ã°ããåŸïŒãã€ã³ã¿ãŒãã§ã€ã¹ã«ãã€ã³ããããŠããªããäœåãªããããªãã¯ã¡ãœããã¯ãããŸããã ãã¡ãããã€ã³ã¿ãŒãã§ã€ã¹èªäœãžã®äŸåé¢ä¿ããªãã¡ã¯ã¿ãªã³ã°ããå¿
èŠããããããããŸããããå°ãªããšããå®è£
ã§ã¯ãªãã€ã³ã¿ãŒãã§ã€ã¹ãžã®ããã°ã©ã ããšããååã«éåããããšã¯ãããŸããã
ããããã£ã«é¢ããŠã¯ãæé»çã«å®è£
ãããã€ã³ã¿ãŒãã§ã€ã¹ããããã£ïŒããããã£ïŒã䜿çšãããšãå€éšããã³ã¯ã©ã¹èªäœããçŽæ¥ã¢ã¯ã»ãµãŒã¡ãœããïŒã²ãã¿ãŒãšã»ãã¿ãŒïŒãä»ããŠã¢ã¯ã»ã¹ã§ããŸããããã«ãããäžèŠãªå¹æïŒããšãã°ãåæåäžã®äžèŠãªããŒã¿æ€èšŒïŒããããã£ïŒã
interface IProperty { int Amount { get; set; } } public class ClassWithProperty : IProperty {
ã€ã³ã¿ãŒãã§ã€ã¹ããããã£ã®æ瀺çãªå®è£
ã§ã¯ããããã®ããããã£ã¯ãã©ã€ããŒãã®ãŸãŸã§ãããã¢ã¯ã»ã¹ã®ããã«ãé·ããéãé²ã¿ãåæåãè¡ãããè¿œå ã®ãã©ã€ããŒããã£ãŒã«ãã宣èšããå¿
èŠããããŸãã ãã®çµæãããããã£ã¢ã¯ã»ã¹ã¡ãœãããå€éšã¢ã¯ã»ã¹ã«ã®ã¿äœ¿çšãããå Žåãããã«ããã³ãŒããç°¡æœã«ãªããŸãã
ããŒã«ã«å€æ°ãšã¯ã©ã¹ãã£ãŒã«ãã®æ瀺çãªåæå®ã®äœ¿çš
ã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çãªå®è£
ã®å Žåãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§äœæ¥ããŠããããšãæ瀺çã«ç€ºãå¿
èŠããããŸãã ãããã£ãŠãããšãã°ãåæšè«ã䜿çšããŠããµãŒãã¹ã¯ãŒãvarã䜿çšããŠCïŒã§ããŒã«ã«å€æ°ã宣èšããããšã¯ã§ããªããªããŸãã 代ããã«ãããŒã«ã«å€æ°ã宣èšãããšããããã³ã¡ãœããã®ã·ã°ããã£ãšã¯ã©ã¹ã®ãã£ãŒã«ãã§ãã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã€ãã瀺ãæ瀺çãªå®£èšã䜿çšããå¿
èŠããããŸãã
ãããã£ãŠãäžæ¹ã§ã¯ãã³ãŒãã®æè»æ§ãããããäœãããŸãïŒããšãã°ãReSharperã¯ãå¯èœã§ããã°åžžã«varã䜿çšãã宣èšã®äœ¿çšãæšå¥šããŸãïŒããã·ã¹ãã ã倧ãããªããµã€ãºã倧ãããªãã«ã€ããŠãç¹å®ã®å®è£
ãžã®ãã€ã³ãã«é¢é£ããæœåšçãªåé¡ãåé¿ããŸããã³ãŒãã ãã®ç¹ã¯å€ãã®ç©è°ãããããŠããããã«æãããããããŸãããããããžã§ã¯ãã«åãçµãã§ãã人ãäžçã®ããŸããŸãªå°åã§ãããæ瀺çãªã¿ã€ãã³ã°ã䜿çšãããšã³ãŒãã®å¯èªæ§ãåäžããã¡ã³ããã³ã¹ã®ã³ã¹ããåæžããããããéåžžã«äŸ¿å©ã§ãã
é¢é£ãœãŒã¹èšäºã®æºåã§ã¯ãå€ãã®ãããã¯ãŒã¯ãœãŒã¹ãç¹ã«ããã°ïŒ
[1] ã
[2] ã
[3]ããã³
[4] ïŒããã®æ
å ±ãããã³StackOverflowããã®
[5]ããã³
[6]ã®è³ªåããã®æ
å ±ã䜿çšãããŸããã CodeProjectããã³Jeffrey Richterã®ã
CïŒçµç±ã®CLR ãã®13.5ç« ã
å°é¡ã®ããŒãã¹ïŒåãæ»ãããã®2ã€ã®è³ªåïŒèå³ãããã人åãïŒãããã®è³ªåã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çãªå®è£
ã®ãããã¯ã«çŽæ¥é¢é£ããŠããŸããããããã§èª°ãã«èå³ããããããããªãããã«æããŸãïŒ
1.ãªã¹ã2ã®å±æ§ãå¥ã®è¡ã§ããå Žå
(sp as Sportsman).Run();
ã³ã³ãœãŒã«ã«ã¯äœã衚瀺ãããŸããïŒ
2.ãªã¹ã3ã®æå°éã®å€æŽïŒããããŒã¯ãŒããå¥ã®ããŒã¯ãŒãã«çœ®ãæããïŒã䜿çšããŠãã³ã³ãœãŒã«ãžã®æåã®è³ªåã§
ãç§ã¯ã¹ããŒããã³ã§ãããšãããã¬ãŒãº
ãååŸããã«ã¯ã©ãããã°ããã§ããïŒ