
ç§ã¯äœãšãCïŒã«é¢ããã€ã³ã¿ãã¥ãŒã®æºåãããŠããŸãããããšããã次ã®å
容ã«ã€ããŠè³ªåãèŠã€ããŸããã
ãå€æ°ã®ã¹ã¬ãããåžžã«ã€ãã³ãããµãã¹ã¯ã©ã€ãããã³ãµãã¹ã¯ã©ã€ã解é€ããŠããå ŽåãCïŒã§ã¹ã¬ããã»ãŒããªã€ãã³ãã³ãŒã«ãç·šæããæ¹æ³ã¯ïŒã
質åã¯éåžžã«å
·äœçã§æ確ã«æèµ·ãããŠããã®ã§ãç§ã¯ããã«å¯Ÿããçããæ確ãã€æ確ã«äžããããšãã§ããããšãçãããããŸããã§ããã ããããç§ã¯éåžžã«ééã£ãŠããŸããã ããã¯éåžžã«äººæ°ããããããããã§ããããŸã éããããããã¯ã§ããããšãå€æããŸããã ãã·ã¢èªã®è³æã§ã¯ãã®åé¡ã«ã»ãšãã©æ³šæãæãããŠããªãããïŒHabrãäŸå€ã§ã¯ãããŸããïŒãç§ã¯ãã®åé¡ã«é¢ããŠèŠã€ããŠæ¶åãããã¹ãŠã®æ
å ±ãåéããããšã«ããŸããã
ãŸãããžã§ã³ã¹ããŒããšãžã§ããªãŒãªãã¿ãŒã«ã€ããŠã説æããŸããå®éããã«ãã¹ã¬ããç°å¢ã§ã€ãã³ããã©ã®ããã«æ©èœããããšããåé¡ãããç解ããäžã§ã圌ãã¯éèŠãªåœ¹å²ãæãããŸããã
ç¹ã«æ³šææ·±ãèªè
ã¯ãèšäºã®äžã«2ã€ã®xkcdã¹ã¿ã€ã«ã®ã³ããã¯ãèŠã€ããã§ãããã
ïŒæ³šæã2ã€ã®åçã®äžã¯çŽ300-400 kbã§ãïŒ
åçãå¿
èŠãªè³ªåãè€è£œããŸãã
ãå€æ°ã®ã¹ã¬ãããåžžã«ã€ãã³ãããµãã¹ã¯ã©ã€ãããã³ãµãã¹ã¯ã©ã€ã解é€ããŠããå ŽåãCïŒã§ã¹ã¬ããã»ãŒããªã€ãã³ãã³ãŒã«ãç·šæããæ¹æ³ã¯ïŒã
ããã€ãã®è³ªåã¯
CïŒãä»ãã
CLRããã¯ã«åºã¥ããŠãããšããä»®å®ããã
ãŸããããNutshellã§ãæ°ã«å
¥ãã®
CïŒ5.0ã¯ãã®ãããªè³ªåã«ãŸã£ãã察å¿ããŠããªãã£ãã®ã§ããžã§ããªãŒãªãã¿ãŒïŒCïŒãä»ããCLRïŒããå§ããŸãããã
ãžã§ããªãŒã»ãªãã¿ãŒã®é
æžé¢ããã®æç²ïŒ
é·ãéãã€ãã³ããåŒã³åºãããã®æšå¥šãããæ¹æ³ã¯ã次ã®æ§æã«ã€ããŠã§ããã
ãªãã·ã§ã³1ïŒpublic event Action MyLittleEvent; ... protected virtual void OnMyLittleEvent() { if (MyLittleEvent != null) MyLittleEvent(); }
ãã®ã¢ãããŒãã®åé¡ã¯ã
OnMyLittleEvent
ã¡ãœããã§1ã€ã®ã¹ã¬ããã
MyLittleEvent
ã€ãã³ã
MyLittleEvent
null
ã§
MyLittleEvent
ãªãããšã確èªã§ãããã®ãã§ãã¯ã®çŽåŸããã ãã€ãã³ãã
MyLittleEvent
åã«ãä»ã®ã¹ã¬ããããµãã¹ã¯ã©ã€ããŒã®ãªã¹ãããããªã²ãŒããåé€ããŠã
MyLittleEvent null
ã€ãã³ã
MyLittleEvent null
ã§ãããã€ãã³ãã³ãŒã«ãã€ã³ãã§
NullReferenceException
ã
NullReferenceException
ãŸãã
ãã®ç¶æ³ãæ確ã«ç€ºãå°ããªxkcdã¹ã¿ã€ã«ã®ã³ããã¯ã次ã«ç€ºããŸãïŒ2ã€ã®ã¹ã¬ããã䞊è¡ããŠåäœããäžããäžã«æéãçµéããŸãïŒã
äžè¬ã«ããã¹ãŠãè«ççã§ãããéåžžã®
競åç¶æ
ïŒä»¥äžã競åç¶æ
ïŒããããŸãã ãããŠãRichterããã®åé¡ãã©ã®ããã«è§£æ±ºãããã以äžã«ç€ºããŸãïŒãããŠããã®ãªãã·ã§ã³ãæãããééããŸãïŒ
ã€ãã³ããåŒã³åºãã¡ãœããã«ããŒã«ã«å€æ°ãè¿œå ããããšã³ããªãã®æç¹ã§ã€ãã³ããã¡ãœããã«ã³ããŒããŸãã ããªã²ãŒãã¯äžå€ãªããžã§ã¯ãïŒä»¥é-äžå€ïŒã§ãããããã€ãã³ãã®ãåçµãã³ããŒãååŸããŸãããã®ã³ããŒããã¯èª°ã賌èªã解é€ã§ããŸããã ã€ãã³ãã®ãµãã¹ã¯
MyLittleEvent
解é€ãããšãæ°ããããªã²ãŒããªããžã§ã¯ããäœæããã
MyLittleEvent
ãã£ãŒã«ãã®ãªããžã§ã¯ãã眮ãæããããŸããã
å€ãããªã²ãŒããªããžã§ã¯ããžã®ããŒã«ã«åç
§ãæ®ã£ãŠããŸãã
ãªãã·ã§ã³2ïŒ protected virtual void OnMyLittleEvent() { Action tempAction = MyLittleEvent;
Richterã«ããã°ãJITã³ã³ãã€ã©ãŒã¯æé©åã®ããã«ããŒã«ã«å€æ°ã®äœæãåã«çç¥ãã2çªç®ã®ãªãã·ã§ã³ããæåã®å€æ°ãäœæãããã€ãŸããããªãŒãºãã€ãã³ããã¹ãããããããšãã§ãããšèª¬æãããŠããŸãã ãã®çµæã
Volatile.Read(ref MyLittleEvent)
ä»ããŠã³ããŒããããšããå§ãããŸãã
ãªãã·ã§ã³3ïŒ protected virtual void OnMyLittleEvent() {
Volatile
ã«ã€ããŠã¯é·ãéåå¥ã«èªãããšãã§ããŸãããäžè¬çãªå Žåã¯ãäžèŠãªJITã³ã³ãã€ã©ãŒã®æé©åãåãé€ãããšãã§ããŸããã ãã®äž»é¡ã«ã€ããŠã¯ãããã«æ確åãšè©³çŽ°ããããŸãããããã§ã¯ããžã§ããªãŒãªãã¿ãŒã«ããçŸåšã®æ±ºå®ã®äžè¬çãªèãæ¹ã«çŠç¹ãåœãŠãŸãã
ã¹ã¬ããã»ãŒããªã€ãã³ãåŒã³åºãã確å®ã«ããã«ã¯ãã€ãã³ããããŒã«ã«å€æ°ã«ã³ããŒããŠçŸåšã®ãµãã¹ã¯ã©ã€ããŒã®ãªã¹ãããããªãŒãºãããåä¿¡ãããªã¹ãã空ã§ãªãå ŽåããããªãŒãºããªã¹ããããã¹ãŠã®ãã³ãã©ãŒãåŒã³åºããŸãã ãããã£ãŠãå¯èœæ§ã®ããNullReferenceException.
ãåãé€ãNullReferenceException.
ç§ã¯ããã«
ããµãã¹ã¯ã©ã€ããããŠããªããªããžã§ã¯ã/ã¹ã¬ããã§ã€ãã³ããããªã¬ãŒã
ãŠãããšããäºå®ã«æ··ä¹±ããŸããã 誰ãããã®ããã«ãµãã¹ã¯ã©ã€ãã解é€ããããšã¯ã»ãšãã©ãããŸãã-ãã¬ãŒã¹ã®äžè¬çãªãã¯ãªãŒãã³ã°ãäžã«èª°ãããããè¡ã£ãå¯èœæ§ããããŸã-æžã蟌ã¿/èªã¿åãã¹ããªãŒã ïŒããšãã°ãã€ãã³ãã§ãã¡ã€ã«ã«ããŒã¿ãæžã蟌ããã¬ãŒïŒãéããŠãæ¥ç¶ãéããŸããªã©ãã€ãŸãããã³ãã©ãŒãåŒã³åºããæç¹ã§ã®ãµãã¹ã¯ã©ã€ããããªããžã§ã¯ãã®å
éšç¶æ
ã¯ã以éã®äœæ¥ã«é©ããªãå¯èœæ§ããããŸãã
ããšãã°ããµãã¹ã¯ã©ã€ãã
IDisposable
ã¡ãœãããå®è£
ãã解æŸãããïŒä»¥éãç Žæ£ãããïŒãªããžã§ã¯ãã§ã¡ãœãããåŒã³åºãããšãããš
ObjectDisposedException
ãã¹ããŒãããšããèŠåã«åŸã£ãŠãããšããŸãã ãŸãã
Dispose
ã¡ãœããã®ãã¹ãŠã®ã€ãã³ãã®
Dispose
ã解é€ããããšã«ãåæããŸãã
次ã«ããã®ãããªã·ããªãªãæ³åããŠãã ãããå¥ã®ã¹ã¬ããããã®ãµãã¹ã¯ã©ã€ããŒã®ãªã¹ãããåçµãããçŽåŸã«ããã®ãªããžã§ã¯ãã§
Dispose
ã¡ãœãããåŒã³åºããŸãã ã¹ã¬ããã¯ããµãã¹ã¯ã©ã€ããããŠããªããªããžã§ã¯ãã®ãã³ãã©ãŒãæ£åžžã«åŒã³åºããŸãããã®ãã³ãã©ãŒã¯ãã€ãã³ããåŠçããããšãããšãã«ãé
ããæ©ãããªããžã§ã¯ãããã§ã«è§£æŸãããããšãèªèãã
ObjectDisposedException
ãã¹ããŒããŸãã ã»ãšãã©ã®å Žåããã®äŸå€ã¯ãã³ãã©ãŒèªäœã«ã¯ãã£ãããããŸãããããµãã¹ã¯ã©ã€ããŒããµãã¹ã¯ã©ã€ã解é€ãããŠè§£æŸãããå Žåããã³ãã©ãŒãåŒã³åºãããããšã¯ãªãããšä»®å®ããããšã¯éåžžã«è«ççã ããã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãã¢ã³ãããŒãžãªãœãŒã¹ã®ãªãŒã¯ããŸãã¯
ObjectDisposedException
æåã«
ObjectDisposedException
ïŒåŒã³åºããããšãã«äŸå€ããã£ããããå ŽåïŒã€ãã³ãåŒã³åºãã¯äžæãããŸãããã€ãã³ãã¯éåžžã®ãã©ã€ãããã³ãã©ãŒã«å°éããŸããã
挫ç»æ¬ã«æ»ãã ç©èªã¯åãã§ã-2ã€ã®ã¹ããªãŒã ãæéãããŠã³ããŸãã å®éã«èµ·ããããšã¯æ¬¡ã®ãšããã§ãã
ç§ã®æèŠã§ã¯ããã®ç¶æ³ã¯ãã€ãã³ãã
NullReferenceException
ãšãã«çºçããå¯èœæ§ã®ãã
NullReferenceException
ãããã¯ããã«æ·±å»ã§ãã
èå³æ·±ãããšã«ãç£èŠå¯Ÿè±¡ãªããžã§ã¯ãã®äž¡åŽã§ã¹ã¬ããã»ãŒãã€ãã³ãããªã¬ãŒãå®è£
ããããã®ãã³ãããããŸãããã¹ã¬ããã»ãŒããã³ãã©ãŒãå®è£
ããããã®ãã³ãã¯ãããŸããã
StackOverflowã¯äœã«ã€ããŠè©±ããŠããã®ã§ããïŒ
SOã§ã¯ããã®åé¡ã«ç¹åãã
詳现ãªãèšäºããèŠã€ããããšãã§ããŸãïŒã¯ãããã®è³ªåã¯å°ããªèšäºå
šäœãæããŠããŸãïŒã
äžè¬ã«ãç§ã®èŠè§£ã¯ããã§å
±æãããŠããŸããããã®åå¿ãè¿œå ãããã®ã¯æ¬¡ã®ãšããã§ãã
ããŒã«ã«å€æ°ã«é¢ãããã®èªå€§åºåã¯ãã¹ãŠã Cargo Cult Programmingã«ä»ãªããªãããã«æããŸãã å€æ°ã®äººã
ããã®æ¹æ³ã§ã¹ã¬ããã»ãŒãã€ãã³ãã®åé¡ã解決ããŸããã å®å
šãªã¹ã¬ããã»ãŒããå®çŸããã«ã¯ããã«å€ãã®äœæ¥ãå¿
èŠã§ãã ãã®ãããªãã§ãã¯ãã³ãŒãã«è¿œå ããªã人ã¯ãã³ãŒããªãã§ãå®è¡ã§ãããšèªä¿¡ãæã£ãŠèšããŸãã ãã®åé¡ã¯ãã·ã³ã°ã«ã¹ã¬ããç°å¢ã«ã¯ååšããŸããããªã³ã©ã€ã³ã³ãŒãäŸã®volatile
ããŒã¯ãŒããæºããããšã¯ãã£ãã«ãªãããšãèãããšããã®è¿œå ãã§ãã¯ã¯ç¡æå³ãããããŸããã NullReferenceException
ã远跡ããããšãç®æšã®å Žåãã¯ã©ã¹ãªããžã§ã¯ãã®åæåäžã«ç©ºã®delegate { }
ã€ãã³ãã«å²ãåœãŠãããšã§ã null
ããŸã£ãããã§ãã¯ããã«å®è¡ã§ããŸããïŒ
ããã«ãããåé¡ã®å¥ã®è§£æ±ºçãåŸãããŸãã
public event Action MyLittleEvent = delegate {};
MyLittleEvent
ã
null
ã«ãªãããšã¯ãããŸãããè¿œå ã®ãã§ãã¯ã
MyLittleEvent
ã§ããŸãã ãã«ãã¹ã¬ããç°å¢ã§ã¯ãã€ãã³ããµãã¹ã¯ã©ã€ããŒã®è¿œå ãšåé€ãåæããã ãã§æžã¿ãŸããã
NullReferenceException
ãåãåãããšãæããã«åŒã³åºãããšãã§ããŸãã
ãªãã·ã§ã³4ïŒ public event Action MyLittleEvent = delegate {}; protected virtual void OnMyLittleEvent() {
åã®ã¢ãããŒã
ãšæ¯èŒãããã®ã¢ãããŒãã®å¯äžã®æ¬ ç¹ã¯ã空ã®ã€ãã³ããåŒã³åºãããã®å°ããªãªãŒããŒãããã§ãïŒãªãŒããŒãããã¯åŒã³åºãããšã«çŽ
5ããç§ã§ããããšãå€æããŸããïŒã ãŸããç°ãªãã€ãã³ããæã€å€æ°ã®ç°ãªãã¯ã©ã¹ã®å Žåãã€ãã³ãã®ãããã®ç©ºã®ãã®ã£ã°ãã¯å€ãã®RAMãå æããŸãããCïŒ3.0
ããSOã®
åç㧠John Skeetãä¿¡ãããšãã³ã³ãã€ã©ã¯åããã®ã䜿çšããŸãåããªããžã§ã¯ãã¯ããã¹ãŠã®ãã®ã£ã°ãã®ç©ºã®ããªã²ãŒãã§ãã
çµæã®ILã³ãŒãããã§ãã¯ãããšãããã®ã¹ããŒãã¡ã³ãã¯ç¢ºèªããããã€ãã³ãããšã«ç©ºã®ããªã²ãŒããäœæãããããšãèªåã§è¿œå ããŸãïŒLINQPadãšILSpyã䜿çšããŠãã§ãã¯ããŸãïŒã 極端ãªå Žåã«ã¯ãããã°ã©ã ã®ãã¹ãŠã®éšåããã¢ã¯ã»ã¹ã§ãã空ã®ããªã²ãŒãã䜿çšããŠããããžã§ã¯ãã«å
±éã®éçãã£ãŒã«ããäœæã§ããŸãã
ãžã§ã³ã»ã¹ããŒãã®é
ãžã§ã³ã¹ããŒãã«çããã®ã§ãã¹ã¬ããã»ãŒãã€ãã³ãã®å®è£
ã«æ³šç®ãã䟡å€ããããŸããããã¯ã
ããªã²ãŒãããã³ã€ãã³ãã»ã¯ã·ã§ã³ã®
CïŒã®è©³çŽ° ïŒ
ãªã³ã©ã€ã³èšäºããã³åå¿
Klotos ã«ãã翻蚳 ïŒã§èª¬æãããŠããŸãã
äžçªäžã®è¡ã¯ã
lock
add
ã
remove
ãããã³local "freeze"ãéããããšã§ããããã«ãããè€æ°ã®ã¹ã¬ããã®ã€ãã³ããåæã«ãµãã¹ã¯ã©ã€ãããªãããèµ·ããããäžç¢ºå®æ§ãåãé€ãããšãã§ããŸãã
ããã€ãã®ã³ãŒã SomeEventHandler someEvent; readonly object someEventLock = new object(); public event SomeEventHandler SomeEvent { add { lock (someEventLock) { someEvent += value; } } remove { lock (someEventLock) { someEvent -= value; } } } protected virtual void OnSomeEvent(EventArgs e) { SomeEventHandler handler; lock (someEventLock) { handler = someEvent; } if (handler != null) { handler (this, e); } }
ãã®ã¡ãœããã¯éæšå¥šã§ãããšããäºå®ã«ããããããïŒCïŒ4.0以éã®ã€ãã³ãã®å
éšå®è£
ã¯ãŸã£ããç°ãªãããã§ããèšäºã®æåŸã«ãããœãŒã¹ã®ãªã¹ããåç
§ããŠãã ããïŒã
lock
ã§ã€ãã³ãã³ãŒã«ããµãã¹ã¯ãªãã·ã§ã³ãããã³ãµãã¹ã¯ã©ã€ããã©ããã§ããªãããšãæ確ã«ç€ºããŠããŸããããã¯ããããããã¯ïŒä»¥äžããããããã¯ïŒã«ã€ãªããå¯èœæ§ãéåžžã«é«ãã§ãã ããŒã«ã«å€æ°ãžã®ã³ããŒã®ã¿ã
lock
ãããã€ãã³ãèªäœã¯ãã®æ§é ã®å€éšã§åŒã³åºãããŸãã
ããããããã¯æªç»é²ã€ãã³ãã®ãã³ãã©ãŒãåŒã³åºãåé¡ãå®å
šã«è§£æ±ºããããã§ã¯ãããŸããã
SOã®è³ªåã«æ»ããŸãã ãããšã«ã¯ã
NullReferenceException
ãé²ãããã®ãã¹ãŠ
ã®æ¹æ³ã«å¯Ÿå¿ããŠãéåžžã«èå³æ·±ãèããæã£ãŠããŸãã
ã¯ãããã¹ãŠã®ã³ã¹ãã§NullReferenceException
ãé²æ¢ããããšããããšã«ã€ããŠããã®NullReferenceException
ãæ¬åœã«ç解ããŸããã ç§ãã¡ã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãå¥ã®ã¹ã¬ãããã€ãã³ãã®ãµãã¹ã¯ã©ã€ãã解é€ããŠããå Žåã«ã®ã¿NullReferenceException
ãçºçããå¯èœæ§ãããããšã話ããŠããŸãã ãããŠåœŒã¯ã ã€ãã³ããäºåºŠãšåãåããªãããã«ããããã ãã«ãããè¡ããŸããå®éãããŒã«ã«å€æ°ã®ãã§ãã¯ã䜿çšããå Žåãããã¯éæãããŸãã ã ã¬ãŒã¹ã®ç¶æ
ãé衚瀺ã«ããå ŽåããããéããŠçµæãä¿®æ£ã§ããŸã ã NullReferenceException
䜿çšNullReferenceException
ãšãã€ãã³ãã®äžé©åãªåŠçã®ç¬éãå€æã§ãNullReferenceException
ã äžè¬ã«ããã®ã³ããŒãšãã§ãã¯ã®ææ³ã¯ãã³ãŒãã«æ··ä¹±ãšãã€ãºãè¿œå ããåçŽãªã«ãŒãŽã«ã«ãããã°ã©ãã³ã°ã§ãããšäž»åŒµããŸããããã«ãã¹ã¬ããã€ãã³ãã®åé¡ã¯ãŸã£ãã解決ããŸããã
ãšãããããžã§ã³ã»ã¹ããŒãã¯è³ªåã«çããŸããããããŠãããã¯åœŒãæžããŠãããã®ã§ãã
ãžã§ã³ã»ã¹ããŒãvs.ãžã§ããªãŒã»ãªãã¿ãŒ
JITã³ã³ãã€ã©ãŒã«ã¯ãæ¡ä»¶ããããããããªã²ãŒããžã®ããŒã«ã«åç
§ãæé©åããæš©å©ããããŸããã ãã®æ
å ±ã¯ãã°ããåã«ãæãããããããããã¯çå®ã§ã¯ãªãïŒJoe DuffyãŸãã¯Vance Morrisonã®ããããã§ãã®è³ªåãæ確ã«ããïŒã volatile
ãªããšãããªã²ãŒããžã®ããŒã«ã«åç
§ãå°ãå€ããªãå¯èœvolatile
ã ãã§ãã ããã«ããã NullReferenceException
ã¯çºçããŸããã
ãããŠãã¯ããééããªã競åç¶æ
ã«ãããŸããããªãã¯æ£ããã§ãã ããããåžžã«ååšããŸãã null
ãã§ãã¯ãåé€ããŠã次ã®ããã«æžããšããŸãããã
MyLittleEvent();
ãµãã¹ã¯ã©ã€ããŒã®ãªã¹ãã1000人ã®ããªã²ãŒãã§æ§æãããŠãããšæ³åããŠãã ããã ãµãã¹ã¯ã©ã€ããŒã®1人ãã€ãã³ãã®ãµãã¹ã¯ãªãã·ã§ã³ã解é€ããåã«ãã€ãã³ãã®ããªã¬ãŒãéå§ããå¯èœæ§ããããŸãã ãã®å Žåãå€ããªã¹ãã«æ®ããããåŒã³åºãããŸãïŒããªã²ãŒããäžå€ã§ããããšãå¿ããªãã§ãã ããïŒã ç§ã®ç¥ãéããããã¯å®å
šã«é¿ããããŸããã
空ã®delegate {};
ã䜿çšããdelegate {};
null
ã®ã€ãã³ãããã§ãã¯ããå¿
èŠãnull
ããããã¯ã¬ãŒã¹ã®æ¬¡ã®ç¶æ
ããç§ãã¡ãæããŸããã ããã«ããã®ã¡ãœããã¯ãã€ãã³ãã®ææ°ããŒãžã§ã³ã䜿çšããããšãä¿èšŒããŸããã
ããŠããã®çãã¯2009幎ã«æžãããCLRã¯CïŒ4th editionãä»ããŠ-2012幎ã«æžãããããšã«æ³šæããå¿
èŠããããŸãã
å®éã
Volatile.Read
ãä»ããŠããŒã«ã«å€æ°ã«ã³ããŒããå Žåã説æããçç±ãç解ããŠããŸããã§ããã圌ã¯Skeetã®èšèãããã«
確èªããŠããããã§ãã
JITã³ã³ãã€ã©ãŒã¯ããŒã«ã«ã®tempAction
å€æ°ãæé©åããããšã§èª€ã£ãŠäœãã§ããããç¥ã£ãŠããããã Volatile.Read
ã䜿çšããããŒãžã§ã³ã䜿çšããããšããå§ãããŸããã ãªãã·ã§ã³2ã¯çç¥ã§ããŸãã çè«çã«ã¯ ãããã¯å°æ¥å€æŽãããå¯èœæ§ãããããã ãªãã·ã§ã³3ã䜿çšããããšããå§ãããŸãã ããããå®éã«ã¯ã Microsoftããã®ãããªå€æŽãè¡ãããšã¯ã»ãšãã©ãããŸãããããã¯ãæ¢è£œã®èšå€§ãªæ°ã®ããã°ã©ã ãç Žå£ããå¯èœæ§ãããããã§ãã
ãã¹ãŠãå®å
šã«æ··ä¹±ããŸã-äž¡æ¹ã®ãªãã·ã§ã³ã¯åçã§ããã
Volatile.Read
ãªãã·ã§ã³
Volatile.Read
ããåçã§ãã ãŸãããµãã¹ã¯ã©ã€ããããŠããªããã³ãã©ãŒãåŒã³åºããšãã«ã競åç¶æ
ããããªããæããªãã·ã§ã³ã¯ãããŸããã
ã€ãã³ããåŒã³åºãã¹ã¬ããã»ãŒããªæ¹æ³ã¯ãŸã£ããååšããªãã®ã§ããããïŒ ãªã
NullReferenceException
ããããªã
NullReferenceException
ãé²ãã®ã«ããã»ã©å€ãã®æéãšåŽåã
NullReferenceException
ããµãã¹ã¯ã©ã€ããããŠããªããã³ãã©ãŒã®åçã®å¯èœæ§ã®ããåŒã³åºããé²ãã®ã«ãªãã§ããïŒ ããã¯åãããŸããã§ããã ããããçããæ¢ãéçšã§ãç§ã¯ä»ã®å€ãã®ããšã«æ°ã¥ããŸãããããã«å°ããªèŠçŽããããŸãã
æåŸã«äœããããŸãã
æè¡çã«ã¯ãæ瀺ããããªãã·ã§ã³ã¯ãããã
ã¹ã¬ããã§ã¯ãããŸãã-ã€ãã³ãã
ããªã¬ãŒãã å®å
šãªæ¹æ³ã§ãã ããã«ãããªã²ãŒãã®ããŒã«ã«ã³ããŒã䜿çšããŠããªã²ãŒãæ€èšŒã¡ãœãããè¿œå ãããš
ã誀ã£ãã»ãã¥ãªãã£æãçããŸã ã èªåèªèº«ãå®å
šã«ä¿è·ããå¯äžã®æ¹æ³ã¯ãç¹å®ã®ã€ãã³ãã®ãµãã¹ã¯ãªãã·ã§ã³ãæ¢ã«è§£é€ãããŠãããã©ããã
ã€ãã³ããã³ãã©ãŒã«åŒ·å¶çã«ç¢ºèªãããããšã§ãã æ®å¿µãªãããã€ãã³ããçºçã
NullReferenceException
ãšãã«
NullReferenceException
ãé²æ¢ããäžè¬çãªæ¹æ³ãšã¯ç°ãªãããã³ãã©ãŒã®èŠå®ã¯ãããŸããã å¥åã®ã©ã€ãã©ãªãäœæããå Žåãã»ãšãã©ã®å ŽåããŠãŒã¶ãŒã«äœããã®æ¹æ³ã§åœ±é¿ãäžããããšã¯ã§ããŸãããã€ãã³ããããµãã¹ã¯ã©ã€ãã解é€ããåŸããã³ãã©ãŒãåŒã³åºãããªããšã¯ã©ã€ã¢ã³ãã«åŒ·å¶ãããããšã¯ã§ããŸããã
ããããã¹ãŠã®åé¡ãèªèããåŸãç§ã¯ãŸã CïŒã§ââã®ããªã²ãŒãã®å
éšå®è£
ã«ã€ããŠè€éãªæ°æã¡ãæ±ããŠããŸããã äžæ¹ã§ããããã¯äžå€ã§ããããã
foreach
ãŠå€æŽã³ã¬ã¯ã·ã§ã³ãåæããå Žåã®ããã«
InvalidOperationException
ã®å¯èœæ§ã¯ãããŸããããäžæ¹ã§
ãåŒã³åºãäžã«èª°ããã€ãã³ããããµãã¹ã¯ã©ã€ãã解é€ãããã©ããã確èªããæ¹æ³ã¯ãããŸããã ã€ãã³ããã«ããŒãå®è¡ã§ããå¯äžã®ããšã¯ã
NullReferenceException
ã«å¯ŸããŠèªèº«ãä¿è·ãããµãã¹ã¯ã©ã€ããŒãäœãå°ç¡ãã«ããªãããã«ããããšã§ãã ãã®çµæãæèµ·ããã質åã¯æ¬¡ã®ããã«åçã§ããŸãã
ãµãã¹ã¯ã©ã€ããããŠããªããµãã¹ã¯ã©ã€ããŒã®ãã³ãã©ãŒãåŒã³åºãå¯èœæ§ãåžžã«ããããããã«ãã¹ã¬ããç°å¢ã§ã¹ã¬ããã»ãŒãã€ãã³ãåŒã³åºããæäŸããããšã¯äžå¯èœã§ãã ãã®äžç¢ºå®æ§ã¯ããã¹ã¬ããã»ãŒããã£ããšããçšèªã®å®çŸ©ãç¹ã«æ¡é
ãšççŸããŠããŸãå®è£
ã¯ãè€æ°ã®ã¹ã¬ããããåæã«ã¢ã¯ã»ã¹ããããšãã«ç«¶åç¶æ
ããªãããšãä¿èšŒãããŠããŸãã
è¿œå ã®èªæž
ãã¡ãããèŠã€ãããã®ããã¹ãŠã³ããŒ/翻蚳ããããšã¯ã§ããŸããã§ããã ãããã£ãŠãçŽæ¥ãŸãã¯éæ¥çã«äœ¿çšããããœãŒã¹ã®ãªã¹ããæ®ããŸãã