翻蚳è
ããã ç§èªèº«ã®çµéšããããããŠä»²éã®ããã°ã©ããŒã®çµéšããå€æãããšãC ïŒ
èšèª ãš.NETãã©ãããã©ãŒã ã® ãã¹ãŠã®åºæ¬çãªæ©èœã® äžã§ãããªã²ãŒããšã€ãã³ãã¯æãè€éãªãã®ã®1ã€ã§ãã ãšèšã ãŸãã ããããããã¯ãäžèŠãããšããããªã²ãŒããšã€ãã³ãã®å¿
èŠæ§ãæçœã§ãªãããã«æããããšããäºå®ããŸãã¯çšèªã®æ··ä¹±ã®ããã§ãã ããã§ãç§ã¯ãžã§ã³ã»ã¹ããŒãã«ãããæãåºæ¬çãªã¬ãã«ã§ãããæã§ãã®ããªã²ãŒããšã€ãã³ãã«é¢ããèšäºã翻蚳ããããšã«ããŸããã C ïŒ
/.NET㫠粟éããŠããã ãããªã²ãŒããšã€ãã³ããç解ããã®ãé£ãã 人ã«çæ³çã§ã ã
ããã§çŽ¹ä»ãã翻蚳ã¯ç¡æã§ãã ãã ããååãšããŠãç¡æããçç¥ãç°¡ç¥åãèšãæããå«ãçç¥ããã翻蚳ãšããŠç解ãããŠããå Žåã¯ããã¹ãŠãéã«ãªããŸãã ãã®ç¿»èš³ã¯ããªãªãžãã«ã®ãããã«æ¡åŒµãæ¹è¯ãæŽæ°ãããããŒãžã§ã³ã§ãã Sergey Teplyakovå¥åSergeyTã«æè¬ããŸã ã圌ã¯ãã®èšäºã®ç¿»èš³ãšãã¶ã€ã³ã«èšãç¥ããªãè²¢ç®ãããŠãããŸãããå€ãã®å Žåãã€ãã³ããšããªã²ãŒãã®éããç解ããã®ã¯å°é£ã§ãã ãŸããCïŒã¯ãåãååã®ããªã²ãŒãå€æ°ã«èªåçã«å€æããããã£ãŒã«ãã®ãããªã€ãã³ãã宣èšã§ãããããç¶æ³ãããã«æ··ä¹±ãããŸãã ãã®èšäºã¯ããã®åé¡ãæ確ã«ããããšãç®çãšããŠããŸãã ãã1ã€ã®ãã€ã³ãã¯ããããªã²ãŒãããšããçšèªãšã®æ··åã§ããããã«ã¯ããã€ãã®æå³ããããŸãã ããªã²ãŒãã¿ã€ããæå®ããããã«äœ¿çšãããããšãããã°ãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãæå®ããããã«äœ¿çšãããããšããããŸãã æ··ä¹±ãé¿ããããã«ãããªã²ãŒãã®ã¿ã€ããšããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹ãããã³ãããªã²ãŒãããšããåèªã䜿çšããå Žåã¯ããããã®çšèªãæ瀺çã«äœ¿çšããŸããã€ãŸããæãåºãæå³ã§ãããã«ã€ããŠè©±ããŸãã
ããªã²ãŒãã®çš®é¡
ããæå³ã§ã¯ãããªã²ãŒãåã¯ãæ確ã«å®çŸ©ããã眲åãæã€ã¡ãœããã1ã€ã ãããã€ã³ã¿ãŒãã§ã€ã¹ãšèããããšãã§ããŸãïŒãã®èšäºã§ã¯ãã¡ãœããã®çœ²åããã®ãã¹ãŠã®å
¥åïŒåºåããã³åç
§ïŒãã©ã¡ãŒã¿ãŒãšããŠç解ããæ»ãå€ïŒã ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããªããžã§ã¯ãã§ãã ãã®æå³ã§ãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã䜿çšãããšããã€ã³ã¿ãŒãã§ã€ã¹ãã§å®çŸ©ãããã¡ãœããã®ã·ã°ããã£ãšã·ã°ããã£ãäžèŽããæ¢åã®ã¡ãœãããåŒã³åºãããšãã§ããŸãã ããªã²ãŒãã«ã¯ä»ã®æ©èœããããŸãããå®çŸ©æžã¿ã®çœ²åã䜿çšããŠã¡ãœãããåŒã³åºãæ©èœã¯ããªã²ãŒãã®æ¬è³ªã§ãã ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã¯ãã¿ãŒã²ããã¡ãœãããžã®åç
§ïŒãã€ã³ã¿ãŒãã©ãã«ïŒãæ ŒçŽãããã®ã¡ãœãããã€ã³ã¹ã¿ã³ã¹ã®å Žåãã¿ãŒã²ããã¡ãœãããé
眮ãããŠãããªããžã§ã¯ãïŒã¯ã©ã¹ãŸãã¯æ§é äœïŒã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ãæ ŒçŽããŸãã
ããªã²ãŒãã¿ã€ãã¯ã
delegate
ããŒã¯ãŒãã䜿çšããŠå®£èšãããŸãã ããªã²ãŒãåã¯ãç¬ç«ãããšã³ãã£ãã£ãšããŠååšããããã¯ã©ã¹ãŸãã¯æ§é å
ã§å®£èšã§ããŸãã äŸïŒ
namespace DelegateArticle { public delegate string FirstDelegate (int x); public class Sample { public delegate void SecondDelegate (char a, char b); } }
ãã®äŸã§ã¯ã2çš®é¡ã®ããªã²ãŒãã宣èšãããŠããŸãã 1ã€ç®ã¯
DelegateArticle.FirstDelegate
ã§ãåå空éã¬ãã«ã§å®£èšãããŸãã ããã¯ã
int
åã®1ã€ã®ãã©ã¡ãŒã¿ãŒãæã¡ã
string
åã®å€ãè¿ãã¡ãœãããšãäºææ§ããããŸããã 2çªç®ã¯
DelegateArticle.Sample.SecondDelegate
ãããã¯ã¯ã©ã¹å
ã§æ¢ã«å®£èšãããŠããããã®ã¡ã³ããŒã§ãã æ»ãåã¯
void
ãšããŠããŒã¯ãããŠããããã
char
åã®2ã€ã®ãã©ã¡ãŒã¿ãŒãæã¡ãäœãè¿ããªãã¡ãœãããšãäºææ§ããããŸããã
äž¡æ¹ã®ã¿ã€ãã®ããªã²ãŒãã«ã¯ã
public
ã¢ã¯ã»ã¹
public
ãŸãã äžè¬ã«ãã¢ã¯ã»ã¹ä¿®é£Ÿåã«é¢ããŠãããªã²ãŒãåã¯ã¯ã©ã¹ããã³æ§é ãšåãããã«åäœããŸãã ã¢ã¯ã»ã¹ä¿®é£Ÿåãããªã²ãŒãã¿ã€ãã«å¯ŸããŠæ瀺çã«æå®ãããŠãããããã®ã¿ã€ããããŒã ã¹ããŒã¹å
ã§å®£èšãããŠããå Žåããã®ããŒã ã¹ããŒã¹å
ã«ãããã¹ãŠã®ãªããžã§ã¯ãã§äœ¿çšã§ããŸãã 修食åãªãã®ããªã²ãŒãåãã¯ã©ã¹ãŸãã¯æ§é å
ã§å®£èšãããŠããå Žåã
private
修食åã®ã¢ã¯ã·ã§ã³ãšåæ§ã«éããããŸãã
ããªã²ãŒãåã宣èšããå Žåã
static
修食åã䜿çšã§ããŸããã
ãã ãã
delegate
ããŒã¯ãŒãã¯å¿
ãããããªã²ãŒãå宣èšãæå³ããããã§ã¯ãªãããšã«æ³šæããŠãã ããã å¿åã¡ãœããã䜿çšããŠããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãäœæããå ŽåãåãããŒã¯ãŒãã䜿çšãããŸãã
ãã®äŸã§å®£èšãããããªã²ãŒãã®äž¡æ¹ã®ã¿ã€ãã¯ã
System.MulticastDelegate
ããç¶æ¿ãã
System.MulticastDelegate
ã¯
System.Delegate
ããç¶æ¿ããŸãã å®éã«ã¯ã
MulticastDelegate
ããã®ç¶æ¿ã®ã¿ãèæ
®ããŠãã ãã
Delegate
ãš
MulticastDelegate
éãã¯ãäž»ã«æŽå²çãªåŽé¢ã«ãããŸãã ãããã®éãã¯ã.NET 1.0ã®ããŒã¿ããŒãžã§ã³ã§ã¯éèŠã§ããããäžäŸ¿ã§ãã£ããããMicrosoftã¯2ã€ã®ã¿ã€ãã1ã€ã«ãŸãšããããšã«ããŸããã æ®å¿µãªããã決å®ã¯é
ãããŸããããããŠã決å®ãäžããããšãã圌ãã¯.NETã®åºç€ã«åœ±é¿ãäžãããã®ãããªé倧ãªå€æŽãæ¢è¡ããŸããã§ããã ãããã£ãŠã
Delegate
ãš
MulticastDelegate
ã¯åäžã®ãã®ã§ãããšèããŠãã ããã
äœæããããªã²ãŒãã®åã¿ã€ãã¯ã
MulticastDelegate
ããã¡ã³ããŒãç¶æ¿ããŸããã€ãŸãã
Object
ãã©ã¡ãŒã¿ãŒãš
IntPtr
ãã©ã¡ãŒã¿ãŒãæã€1ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšã
Invoke
ã
BeginInvoke
ã
EndInvoke
3ã€ã®ã¡ãœããã§ãã ããšã§ãã¶ã€ããŒã«æ»ããŸãã å®éããããã®3ã€ã®ã¡ãœããã¯ãããªã²ãŒãã®åã¿ã€ãã®ã·ã°ããã£ãç°ãªããããæåéãç¶æ¿ãããŸãã-宣èšãããããªã²ãŒãã¿ã€ãã®ã¡ãœããã®ã·ã°ããã£ã«ãé©å¿ãããŸãã äžèšã®ã³ãŒãäŸãèŠãŠã
FirstDelegate
ããªã²ãŒãã®æåã®ã¿ã€ãã®ãç¶æ¿ããããã¡ãœããã掟çãããŸãã
public string Invoke (int x); public System.IAsyncResult BeginInvoke(int x, System.AsyncCallback callback, object state); public string EndInvoke(IAsyncResult result);
ã芧ã®ãšããã
Invoke
EndInvoke
ãš
EndInvoke
ã®æ»ãå€ã®åã¯ã
Invoke
ã¡ãœãããã©ã¡ãŒã¿ãŒãšæåã®
BeginInvoke
ãã©ã¡ãŒã¿ãŒã®ããã«ãããªã²ãŒãã·ã°ããã£ã§æå®ããããã®ãšäžèŽããŸãã
Invoke
ã¡ãœããã®ç®çã¯ãã®èšäºã®åŸåã§ã
BeginInvoke
ãš
EndInvoke
ã¯ããªã²ãŒãã®é«åºŠãªäœ¿çšæ³ã説æããã»ã¯ã·ã§ã³ã§èª¬æããŸãã ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãäœæããæ¹æ³ããç¥ããªããããããã«ã€ããŠè©±ãã®ã¯ææå°æ©ã§ãã ããã«ã€ããŠã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãã
ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ïŒåºæ¬
ããªã²ãŒãåãã©ã®ããã«å®£èšãããäœãå«ãŸããŠããããããã£ãã®ã§ãããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããæ¹æ³ãšãããã§äœãã§ããããèŠãŠã¿ãŸãããã
ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã®äœæ
ãŸãããã®èšäºã§ã¯ãCïŒ4.0ã«ç»å Žããäžè¬åãããããªã²ãŒããã«ããŒããŠããªãã®ãšåæ§ã«ãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã®äœæã«é¢é£ããCïŒ2.0ããã³3.0ã®æ°æ©èœã«ã€ããŠã¯è§ŠããŠããŸããã ã¯ããŒãžã£ãŒã«ã€ããŠã®å¥ã®èšäº
The Beauty of Closuresã§ã¯ãCïŒ2.0ããã³3.0ã«ç»å Žããæ°ããããªã²ãŒãæ©èœã«ã€ããŠèª¬æããŠããŸãã ããã«ããã®ãããã¯ã«é¢ããå€ãã®æ
å ±ã¯ãç§ã®èæžã
CïŒin Depth ãã®ç¬¬5ç« ã第9ç« ãããã³ç¬¬13ç« ã«å«ãŸããŠããŸãã CïŒ1.0 / 1.1ã«ç»å Žããæ瀺çãªããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹åã¹ã¿ã€ã«ãé å®ããŸããããã¯ããã®ãããªã¹ã¿ã€ã«ã®æ¹ããããŒãã®äžã§ãäœãèµ·ãã£ãŠããããç解ãããããšæãããã§ãã ããã§ãåºæ¬ãç解ããããCïŒ2.0ã3.0ãããã³4.0ã®æ°æ©èœãåŠç¿ã§ããŸãã éããŸãåæ§ã§ãããã®èšäºã«èšèŒãããŠããåºæ¬äºé
ããã£ããç解ããŠããªããšãããªã²ãŒãã®ãæ°ãããæ©èœã¯èããããªããããããŸããã
åè¿°ã®ããã«ãããªã²ãŒãã®åã€ã³ã¹ã¿ã³ã¹ã«ã¯ãå¿
ç¶çã«ãããªã²ãŒãã®ãã®ã€ã³ã¹ã¿ã³ã¹ãä»ããŠåŒã³åºãããšãã§ããã¿ãŒã²ããã¡ãœãããžã®åç
§ãšãã¿ãŒã²ããã¡ãœããã宣èšãããŠãããªããžã§ã¯ãïŒã¯ã©ã¹ãŸãã¯æ§é äœïŒã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ãå«ãŸããŸãã ã¿ãŒã²ããã¡ãœãããéçã§ããå Žåããã¡ããã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ã¯ãããŸããã CLRã¯ãéçã¡ãœããã«æž¡ãããæåã®åŒæ°ãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã«æ ŒçŽãããããã¡ãœãããåŒã³åºããããšãã«ã¿ãŒã²ããã€ã³ã¹ã¿ã³ã¹ã¡ãœãããžã®åç
§ãåŒæ°ãšããŠæž¡ããããä»ã®ãããã«ç°ãªã圢åŒã®ããªã²ãŒãããµããŒãããŸãã 詳现ã«ã€ããŠã¯ãMSDNã®
System.Delegate
ããã¥ã¡ã³ããåç
§ããŠãã ããããã ãããã®æ®µéã§ã¯ããã®è¿œå æ
å ±ã¯éèŠã§ã¯ãããŸããã
ãããã£ãŠãã€ã³ã¹ã¿ã³ã¹ãäœæããã«ã¯ã2ã€ã®ããŠããããã®ããŒã¿ïŒãã¡ãããããªã²ãŒãèªäœã®ã¿ã€ãïŒãå¿
èŠã§ããããšãç¥ã£ãŠããŸãããã©ã®ããã«ã³ã³ãã€ã©ã«ç¥ãããã®ã§ããïŒ CïŒä»æ§ã§ã
delegate-creation-expression ããšåŒã°ãããã®ã䜿çšããŸããããã¯ã
æ°ããdelegate-typeïŒexpressionïŒã®åœ¢åŒã§ãã åŒã¯ãåãåã®å¥ã®ããªã²ãŒãïŒãŸãã¯CïŒ2.0ã®äºææ§ã®ããããªã²ãŒãåïŒããŸãã¯ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãžã®ã¡ãœããåãšãªãã·ã§ã³ã®åç
§ã§æ§æããããã¡ãœããã°ã«ãŒããã§ããå¿
èŠããããŸãã ã¡ãœããã®ã°ã«ãŒãã¯ãéåžžã®ã¡ãœããåŒã³åºããšåãããã«æå®ãããŸãããåŒæ°ãšæ¬åŒ§ã¯ãããŸããã ããªã²ãŒãã³ããŒãäœæããå¿
èŠã¯ã»ãšãã©ãªããããããäžè¬çãªãã©ãŒã ã«çŠç¹ãåœãŠãŸãã 以äžã«äŸã瀺ããŸãã
FirstDelegate d1 = new FirstDelegate(InstanceMethod); FirstDelegate d2 = new FirstDelegate(this.InstanceMethod); FirstDelegate d3 = new FirstDelegate(anotherInstance.InstanceMethod); FirstDelegate d4 = new FirstDelegate(instanceOfOtherClass.OtherInstanceMethod); FirstDelegate d5 = new FirstDelegate(StaticMethod); FirstDelegate d6 = new FirstDelegate(OtherClass.OtherStaticMethod);
åã«èª¬æããããªã²ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ã
System.IntPtr
åã®ã¡ãœãããžã®åç
§ïŒMSDNããã¥ã¡ã³ãã§ã¯ãã®ãã©ã¡ãŒã¿ãŒã¯methodãšåŒã°ããŸãïŒãš
System.Object
åã®ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ïŒMSDNããã¥ã¡ã³ããŒã·ã§ã³ã§ã¯ãã®ãã©ã¡ãŒã¿ãŒã¯targetãšåŒã°ããŸãïŒ methodãã©ã¡ãŒã¿ãŒã§æå®ãããã¡ãœãããéçãªå Žåãnullãåãå
¥ããŸãã
éèŠãªç¹ïŒããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã¯ãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã
åŒã³åºãããã³ãŒãå
ã®å Žæã«é¢ããŠïŒã¹ã³ãŒãå€ã§ïŒèŠããªããªããžã§ã¯ãã®ã¡ãœãããšã€ã³ã¹ã¿ã³ã¹ãåç
§ã§ããŸãã ããšãã°ãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãäœæããå Žåããã©ã€ããŒãã¡ãœããã䜿çšãããã®ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãå¥ã®ãããªãã¯ã¡ãœãããŸãã¯ããããã£ããè¿ãããšãã§ããŸãã äžæ¹ãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã®äœææã«æå®ããããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã¯ãåŒã³åºããããšãã«ãåŒã³åºããè¡ããããªããžã§ã¯ãã«é¢ããŠäžæã«ãªããªããžã§ã¯ãã«ããããšãã§ããŸãã éèŠãªããšã¯ãããªã²ãŒããã€ã³ã¹ã¿ã³ã¹åãããæç¹ã§ãã¡ãœãããšãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã®äž¡æ¹ãïŒã¹ã³ãŒãå
ã§ïŒå©çšå¯èœã§ãªããã°ãªããªãããšã§ãã ã€ãŸããã³ãŒãå
ã§ç¹å®ã®ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããã®ã€ã³ã¹ã¿ã³ã¹ããç¹å®ã®ã¡ãœãããåŒã³åºãããšãã§ããå ŽåïŒã®ã¿ïŒããã®ã¡ãœãããšãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠãããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã ãã ãã以åã«äœæããããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹ãžã®åŒã³åºãäžã¯ãã¢ã¯ã»ã¹æš©ãšã¹ã³ãŒãã¯ç¡èŠãããŸãã 課é¡ãšããã°...
ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã®åŒã³åºã
ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã¯ãéåžžã®ã¡ãœãããåŒã³åºãããã®ãšåãæ¹æ³ã§åŒã³åºãããŸãã ããšãã°ã
delegate string FirstDelegate (int x)
ãšããŠæäžéšã§ã¿ã€ããå®çŸ©ãããŠããããªã²ãŒãã€ã³ã¹ã¿ã³ã¹d1ãåŒã³åºããšã次ã®ããã«ãªããŸãã
string result = d1(10);
ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã«ãã£ãŠåç
§ãããã¡ãœããã¯ããªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ïŒããå ŽåïŒãšãwithinãïŒãŸãã¯ãin contextãïŒãšåŒã°ããçµæãè¿ãããŸãã ããªã²ãŒãã®äœæ¥ã瀺ãæ¬æ Œçãªããã°ã©ã ãäœæãããšåæã«ããäœåãªãã³ãŒããå«ãŸãªãã³ã³ãã¯ããªããã°ã©ã ãäœæããããšã¯ç°¡åãªäœæ¥ã§ã¯ãããŸããã ãã ãã以äžã¯1ã€ã®éçã¡ãœãããš1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã¡ãœãããå«ãåæ§ã®ããã°ã©ã ã§ãã
DelegateTest.StaticMethod
ãåŒã³åºãããšã¯ã
StaticMethod
ãåŒã³åºãããš
DelegateTest.StaticMethod
åçã§ããäŸãããããããããããã«ãã¯ã©ã¹åãå«ããŸããã
using System; public delegate string FirstDelegate (int x); class DelegateTest { string name; static void Main() { FirstDelegate d1 = new FirstDelegate(DelegateTest.StaticMethod); DelegateTest instance = new DelegateTest(); instance.name = "My instance"; FirstDelegate d2 = new FirstDelegate(instance.InstanceMethod); Console.WriteLine (d1(10));
ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãåŒã³åºãããã®CïŒæ§æã¯ãåããªã²ãŒãã¿ã€ããæã€invokeã¡ãœããåŒã³åºãããã¹ã¯ããæ§æç³è¡£ã§ãã ããªã²ãŒãã¯ã
BeginInvoke/EndInvoke
ãæäŸããå Žåãéåæã§å®è¡ã§ããŸãããããã«ã€ããŠã¯
åŸã§è©³ãã説æããŸãã
ããªã²ãŒãã®çµã¿åãã
ããªã²ãŒãã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãåŒã³åºããšãã¡ãœããã®ã»ããå
šäœãåŒã³åºããããããã®ã¡ãœããã¯ç°ãªãã¯ã©ã¹ã®ç°ãªãã€ã³ã¹ã¿ã³ã¹ããååŸã§ããããã«ãããªã²ãŒããçµåïŒçµåããã³æžç®ïŒã§ããŸãã ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãã¡ãœãããšãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ãæ ŒçŽãããšä»¥åã«èšã£ããšããç©äºãå°ãåçŽåããŸããã ããã¯ãåãã¡ãœãããè¡šãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã«åœãŠã¯ãŸããŸãã æ確ã«ããããã«ã以éããã®ãããªããªã²ãŒãã®
ã€ã³ã¹ã¿ã³ã¹ã ãåçŽãªããªã²ãŒããïŒåçŽãªããªã²ãŒãïŒãšåŒã³
ãŸã ã 察ç
§çã«ãå®éã«ã¯åçŽãªããªã²ãŒãã®ãªã¹ãã§ããããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãããããããã¯ãã¹ãŠåãã¿ã€ãã®ããªã²ãŒãã«åºã¥ããŠããŸãïŒã€ãŸããåç
§ãããŠããã¡ãœããã®çœ²åãåãã§ãïŒã ãã®ãããª
ããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹ã ãçµåããªã²ãŒããïŒçµåããªã²ãŒãïŒãšåŒã³
ãŸã ã çµåãããè€æ°ã®ããªã²ãŒããäºãã«çµã¿åãããŠãåçŽãªããªã²ãŒãã®1ã€ã®å€§ããªãªã¹ãã«ã§ããŸãã çµåãããããªã²ãŒãå
ã®åçŽãªããªã²ãŒãã®ãªã¹ãã¯ããåŒã³åºããªã¹ãããŸãã¯ãåŒã³åºããªã¹ãããšåŒã°ããŸãã ãããã£ãŠãåŒã³åºããªã¹ãã¯ãåŒã³åºãã®é åºã§é
眮ããããªããžã§ã¯ãã®ã¡ãœãããšã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ã®ãã¢ã®ãªã¹ãã§ãã
ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã¯åžžã«äžå€ã§ããããšãç¥ã£ãŠããããšãéèŠã§ãã ããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹ãçµåãããã³ã«ïŒããã³æžç®ããå Žå-以äžã§ãããæ€èšããŸãïŒãæ°ããçµåããªã²ãŒããäœæãããŸãã æååã®å ŽåãšãŸã£ããåãã§ã
String.PadLeft
ãæååã®ã€ã³ã¹ã¿ã³ã¹ã«é©çšãããšãã¡ãœããã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãå€æŽããŸããããå€æŽãå ããããæ°ããã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã
2ã€ã®ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹éã®çµåïŒãå ç®ããšããçšèªãçºçããŸãïŒã¯ãéåžžãããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãæ°åãŸãã¯æååã§ãããã®ããã«ãå ç®æŒç®åã䜿çšããŠè¡ãããŸãã åæ§ã«ãããªã²ãŒãã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãå¥ã®ã€ã³ã¹ã¿ã³ã¹ããæžç®ïŒãåé€ããšããçšèªãçºçïŒããã«ã¯ãæžç®æŒç®åã䜿çšããŸãã 1ã€ã®çµåãããããªã²ãŒããå¥ã®ããªã²ãŒãããæžç®ããå Žåãæžç®ã¯åŒã³åºããªã¹ãã®äžéšãšããŠå®è¡ãããããšã«æ³šæããŠãã ããã å
ã®ïŒåæžãããïŒåŒã³åºããªã¹ãã«ãæ§é€å¯èœãªåŒã³åºããªã¹ãã«å«ãŸããŠããåçŽãªããªã²ãŒãã1ã€ããªãå ŽåãçµæïŒå·®ïŒã¯å
ã®ãªã¹ãã«ãªããŸãã ãã以å€ã®å Žåãå
ã®ãªã¹ãã«åçŽãªããªã²ãŒããå«ãŸããŠããŠããããæžç®ãããããªã²ãŒãã«ååšããå ŽåãåçŽãªããªã²ãŒãã®
æåŸã®åºçŸã®ã¿ãçµæã®ãªã¹ãã«ååšããŸããã ãã ããããã¯èšèã§èª¬æãããããäŸã§ç€ºãæ¹ãç°¡åã§ãã ãããã次ã®ãœãŒã¹ã³ãŒãã®ä»£ããã«ã次ã®è¡šã®äŸã䜿çšããŠçµåãšæžç®ã®æäœã瀺ããŸãã ãã®äžã§ããªãã©ã«d1ãd2ãd3ã¯åçŽãªããªã²ãŒãã瀺ããŸãã ããã«ã[d1ãd2ãd3]ãšããæå®ã¯ããã®é åºã§3ã€ã®åçŽãªããªã²ãŒãã§æ§æãããè€åããªã²ãŒããæå³ããŸããã€ãŸãã åŒã³åºããããšãd1ãæåã«åŒã³åºããã次ã«d2ã次ã«d3ãåŒã³åºãããŸãã 空ã®ã³ãŒã«ãªã¹ãã¯nullã§ãã
è¡šçŸ | çµæ |
---|
null + d1 | d1 |
d1 + null | d1 |
d1 + d2 | [d1ãd2] |
d1 + [d2ãd3] | [d1ãd2ãd3] |
[d1ãd2] + [d2ãd3] | [d1ãd2ãd2ãd3] |
[d1ãd2]-d1 | d2 |
[d1ãd2]-d2 | d1 |
[d1ãd2ãd1]-d1 | [d1ãd2] |
[d1ãd2ãd3]-[d1ãd2] | d3 |
[d1ãd2ãd3]-[d2ãd1] | [d1ãd2ãd3] |
[d1ãd2ãd3ãd1ãd2]-[d1ãd2] | [d1ãd2ãd3] |
[d1ãd2]-[d1ãd2] | ãã« |
å ç®æŒç®åã«å ããŠãéçãª
Delegate.Combine
ã¡ãœããã䜿çšããŠããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ãçµåã§ããŸãã åæ§ã«ãæžç®æäœã«ã¯ãéçã¡ãœãã
Delegate.Remove
圢åŒã®ä»£æ¿æ段ããããŸãã äžè¬çã«ãå ç®æŒç®åãšæžç®æŒç®åã¯äžçš®ã®æ§æäžã®ç ç³ã§ãããCïŒã³ã³ãã€ã©ãŒã¯ã³ãŒãã§ããããæºãããCombineã¡ãœãããšRemoveã¡ãœããã®åŒã³åºãã«çœ®ãæããŸãã ãããã®ã¡ãœããã¯éçã§ãããããnullããªã²ãŒããç°¡åã«åŠçã§ããŸãã
å ç®æŒç®åãšæžç®æŒç®åã¯ãåžžã«ä»£å
¥æŒç®
d1 += d2
äžéšãšããŠæ©èœããŸããããã¯ãåŒ
d1 = d1+d2
ãšå®å
šã«åçã§ãã æžç®ã§ãåãã§ãã ç¹°ãè¿ããŸãããå ç®ãšæžç®ã«é¢ä¿ããããªã²ãŒãã®ã€ã³ã¹ã¿ã³ã¹ã¯ãæäœäžã«å€æŽãããªãããšãæãåºããŠãã ããã ãã®äŸã§ã¯ãå€æ°d1ã¯ããå€ããd1ãšd2ã§æ§æãããæ°ããäœæãããçµåããªã²ãŒããžã®ãªã³ã¯ãåã«å€æŽããŸãã
ããªã²ãŒãã®è¿œå ãšåé€ã¯ãªã¹ãã®æåŸããè¡ããããããåŒã³åºãã·ãŒã±ã³ã¹x + = y; x-= y; 空ã®æäœã«çžåœããŸãïŒå€æ°xã«ã¯ãµãã¹ã¯ã©ã€ããŒã®äžå€ãªã¹ããå«ãŸããŸãïŒ
çŽtransl ïŒïŒã
ããªã²ãŒãåã·ã°ããã£ãå€ãè¿ãããã«å®£èšãããŠããïŒã€ãŸããæ»ãå€ãvoidã§ã¯ãªãïŒå Žåãããªã²ãŒãã®ãçµåããããã€ã³ã¹ã¿ã³ã¹ããã®åã«åºã¥ããŠäœæãããåŒã³åºããããšãæåŸã®åçŽãªããªã²ãŒãã«ãã£ãŠãæäŸããããæ»ãå€ãå€æ°ã«æžã蟌ãŸããŸãè€åããªã²ãŒãåŒã³åºããªã¹ãã
çµåãããããªã²ãŒãïŒå€ãã®åçŽãªããªã²ãŒãã§æ§æãããåŒã³åºããªã¹ããå«ãïŒããããããã€ãã®åçŽãªããªã²ãŒãã§åŒã³åºããããšãã«äŸå€ãçºçãããšããã®æç¹ã§çµåããªã²ãŒãã®åŒã³åºããåæ¢ããäŸå€ãã¹ããŒãããåŒã³åºããªã¹ãããä»ã®ãã¹ãŠã®åçŽãªããªã²ãŒãåŒã³åºãããããšã¯ãããŸããã
ã€ãã³ã
ãŸãæåã«ïŒã€ãã³ãã¯ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããŸããã ãããŠä»åã³ïŒ
ã€ãã³ãã¯ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããŸãããããæå³ã§ã¯ãCïŒãç¹å®ã®ç¶æ³ã§åãæ¹æ³ã§ã€ãã³ããšããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã®äœ¿çšãèš±å¯ããã®ã¯æ®å¿µã§ãããéããç解ããããšã¯éåžžã«éèŠã§ãã
ã€ãã³ããç解ããæåã®æ¹æ³ã¯ãã€ãã³ããã䌌ããããããã£ãšèããããšã§ãããšããçµè«ã«éããŸããã ããããã£ã¯ã䌌ãŠããããã£ãŒã«ãã«èŠããŸãããå®éã«ã¯ããã§ã¯ãããŸããããã£ãŒã«ãããŸã£ãã䜿çšããªãããããã£ãäœæã§ããŸãã ã€ãã³ãã¯åæ§ã«æ¯ãèããŸã-å ç®ããã³æžç®æŒç®ã®ç¹ã§ã¯ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã®ããã«èŠããŸãããå®éã«ã¯ããã§ã¯ãããŸããã
ã€ãã³ãã¯ãILïŒCILãMSILïŒã§é©åã«ããã¬ãŒã åããããçžäºæ¥ç¶ãããã¡ãœããã®ãã¢ã§ããããã«ãããèšèªç°å¢ã¯ããåçŽãã¡ãœããã§ã¯ãªããã€ãã³ããè¡šãã¡ãœããã§ãåŠçãããããšãæ確ã«èªèããŸãã ã¡ãœããã¯ãè¿œå ããã³
åé€æäœã«å¯Ÿå¿ããŸããåæäœã¯ãã€ãã³ãã®åãšåãåãæã€ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã§1ã€ã®ãã©ã¡ãŒã¿ãŒãåãåããŸãã ãããã®æäœã§è¡ãããšã¯äž»ã«ããªã次第ã§ãããéåžžãè¿œå æäœãšåé€æäœã¯ãã€ãã³ããã³ãã©ãŒã®ãªã¹ããžã®ããªã²ãŒãã€ã³ã¹ã¿ã³ã¹ã®è¿œå ãšåé€ã«äœ¿çšãããŸãã ã€ãã³ããçºçãããšïŒãããŠããã¿ã³ã®ã¯ãªãã¯ãã¿ã€ããŒããŸãã¯æªåŠçã®äŸå€ãªã©ãäœãçºçãããã¯é¢ä¿ãããŸããïŒããã³ãã©ãŒãé çªã«åŒã³åºãããŸãïŒé çªã«ïŒã CïŒã§ã¯ãã€ãã³ããã³ãã©ãŒã®åŒã³åºãã¯ã€ãã³ãèªäœã®äžéšã§ã¯
ãªãããšã«æ³šæããŠãã ããã
C#
eventName += delegateInstance;
eventName -= delegateInstance;
,
eventName
(,
myForm.Click
) (,
MyClass.SomeEvent
). , .
. â (explicit) add remove; (get) (set), event.
System.EventHandler
. , add remove , â , . , , remove , , null.
using System; class Test { public event EventHandler MyEvent
,
value
, . , , , , . , , , , , â . Windows Forms â .. , null.
Field-like
C# . «field-like » (field-like event) â , «» ( ), «» add remove.
public event EventHandler MyEvent;
. (.., ), . (implicit) / , (lock). C# 1.1
MyEvent
:
private EventHandler _myEvent; public event EventHandler MyEvent { add { lock (this) { _myEvent += value; } } remove { lock (this) { _myEvent -= value; } } }
ããã¯ãã€ã³ã¹ã¿ã³ã¹ã¡ã³ããŒçšã§ããéçã€ãã³ãã«é¢ããŠã¯ãå€æ°ãéçã§ããããã¥ãŒã¿ã€ãã§ããã¯ããã£ããã£ãããŸãtypeof(XXX)
, XXX â , . C# 2.0 , . , , , â , . ( , , , . ; , .) , , .
.
, ,
MyEvent
? ( ) , (
_myEvent
). , .
ãã€ã³ãã¯äœã§ããïŒ
, , , : , ? â - . , C#/.NET . ? :
- () .
- () .
- () AddXXXHandler RemoveXXXHandler.
â1 â , , . â2 , (override) â
someInstance.MyEvent = eventHandler;
,
eventHandler
, ,
eventHandler
. , .
â3 â , , , , ( IL) «» , field-like . / , .
(: C# 4 . : . «
»)
(locking), field-like add remove, . (thread safety). , . , C# 2.0 this- . , (deadlock).
, â - , C# 2.0 , , , , , () . - , ,
1â .
, , , , , , , add/remove , «» add/remove . :
, - â . , «»
( , ), null
: , . , , , - , add/remove , .
,
handler
someEvent, handler ,
someEvent
. , ,
someEvent
null,
handler
, , . , (immutable), , (
handler = someEvent
) (
handler (this, e);
), .
, , . ? ? , «». , , , . , add/remove, ; , , C# «» «» . . â , .
OnSomeEvent
someEvent
( , add remove), null, , null. . - (no-op), « » .
OnSomeEvent
. «» , - .
:
,
someDelegate(10)
â
someDelegate.Invoke(10)
.
Invoke
,
BeginInvoke
/
EndInvoke
. CLI , C# . , .NET, (callback handler) , . , (thread-pool) .NET.
,
2â , ,
BeginInvoke
EndInvoke
. , , , . , , , «» , .
EndInvoke
, . ,
EndInvoke
.
using System; using System.Threading; delegate int SampleDelegate(string data); class AsyncDelegateExample1 { static void Main() { SampleDelegate counter = new SampleDelegate(CountCharacters); SampleDelegate parser = new SampleDelegate(Parse); IAsyncResult counterResult = counter.BeginInvoke("hello", null, null); IAsyncResult parserResult = parser.BeginInvoke("10", null, null); Console.WriteLine(" ID = {0} ", Thread.CurrentThread.ManagedThreadId); Console.WriteLine(" '{0}'", counter.EndInvoke(counterResult)); Console.WriteLine(" '{0}'", parser.EndInvoke(parserResult)); Console.WriteLine(" ID = {0} ", Thread.CurrentThread.ManagedThreadId); } static int CountCharacters(string text) { Thread.Sleep(2000); Console.WriteLine(" '{0}' ID = {1}", text, Thread.CurrentThread.ManagedThreadId); return text.Length; } static int Parse(string text) { Thread.Sleep(100); Console.WriteLine(" '{0}' ID = {1}", text, Thread.CurrentThread.ManagedThreadId); return int.Parse(text); } }
Thread.Sleep
, ,
CountCharacters
Parse
.
CountCharacters
2 , â , , ( ). «» , «», . :
ID = 9
'10' ID = 10
'hello' ID = 6
'5'
'10'
ID = 9
,
EndInvoke
Thread.Join
â , .
IAsyncResult
,
BeginInvoke
EndInvoke
,
BeginInvoke
( â
Object state
), .
, , , (callback model), . , (callback)
EndInvoke
, . ( ), , , . ,
BeginInvoke
. , , , .
state
Object
, ,
DisplayResult
.
IAsyncResult
AsyncResult
: , ,
AsyncResult
, , ,
EndInvoke
. ,
AsyncResult
System.Runtime.Remoting.Messaging
( ),
System
System.Threading
.
using System; using System.Threading; using System.Runtime.Remoting.Messaging; delegate int SampleDelegate(string data); class AsyncDelegateExample2 { static void Main() { SampleDelegate counter = new SampleDelegate(CountCharacters); SampleDelegate parser = new SampleDelegate(Parse); AsyncCallback callback = new AsyncCallback(DisplayResult); counter.BeginInvoke("hello", callback, " '{0}' ID = {1}"); parser.BeginInvoke("10", callback, " '{0}' ID = {1}"); Console.WriteLine(" ID = {0} ", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(3000); Console.WriteLine(" ID = {0} ", Thread.CurrentThread.ManagedThreadId); } static void DisplayResult(IAsyncResult result) { string format = (string)result.AsyncState; AsyncResult delegateResult = (AsyncResult)result; SampleDelegate delegateInstance = (SampleDelegate)delegateResult.AsyncDelegate; Int32 methodResult = delegateInstance.EndInvoke(result); Console.WriteLine(format, methodResult, Thread.CurrentThread.ManagedThreadId); } static int CountCharacters(string text) { Thread.Sleep(2000); Console.WriteLine(" '{0}' ID = {1}", text, Thread.CurrentThread.ManagedThreadId); return text.Length; } static int Parse(string text) { Thread.Sleep(100); Console.WriteLine(" '{0}' ID = {1}", text, Thread.CurrentThread.ManagedThreadId); return int.Parse(text); } }
. «» , . (background) , «» (.. ), , ,
Thread.Sleep(3000)
â , 3- . ,
Thread.Sleep(3000)
â .
. â ,
EndInvoke
. (100 ), (2 ), , , .
ID = 9
'10' ID = 11
'10' ID = 11
'hello' ID = 10
'5' ID = 10
ID = 9
,
EndInvoke
; , .
EndInvoke
, . «
Multi-threading in .NET: Introduction and suggestions », , , «
The Thread Pool and Asynchronous Methods ».
ãããã«
. , , .
泚é
1.
. perevã , . , â , , «CLR via C#» , 4 . 2006 , 2007 , « 5. CLR» â « 24. » â « «» ».
2.
. perevã , , . . , , , .
翻蚳è
ãã
, , , . , , , . , , .
.
(RSDN).
( 2006 ) , « » : MulticastDelegate, , MSIL, EventHandlerList, . , , .
coffeecupwinner .
.NET .
, «
»? C# 4 field-like , , : Interlocked.CompareExchange, . , , . , , , .
Daniel Grunwald.
andreycha .
C# .
C#/.NET C++ , , . : , .
rroyter .
C#?, , . , . , , C# 2- 3- .