ããã¯ã Struct / Classã®ç« ãšãã®éãããã®æç²ã§ãã
ã¯ã©ã¹/æ§é éã®éžæã®æ©èœ
äž¡æ¹ã®ã¿ã€ãã®æ©èœããããã®é·æãšçæã«ã€ããŠèããããããããé©åã«äœ¿çšããå Žæã決ããŸãããã ããã§ããã¡ãããéžæã¯éèŠãªåã«å¯Ÿãããã®ã§ãããšãã声æãåºããŠããå€å žãæãåºã䟡å€ããããŸããç§ãã¡ã®åãç¶æ¿å¯èœã§ããããšãèšç»ããŠããªãå Žåãããã¯ãã®å¯¿åœã®éã«å€æŽãããããã®ãµã€ãºã¯16ãã€ããè¶ ããŸããã ãããããã¹ãŠãããã»ã©æçœã§ã¯ãããŸããã å®å šãªæ¯èŒãè¡ãã«ã¯ãããŸããŸãªè§åºŠããã¿ã€ããéžæããå°æ¥ã®äœ¿çšã«åããŠã·ããªãªã粟ç¥çã«èããŠèããå¿ èŠããããŸãã
ã泚æ
Habréã§å ¬éãããŠããç« ã¯æŽæ°ãããŠãããããããããã§ã«å€ããã®ã§ãã ãã®ãããææ°ã®ããã¹ãã«ã€ããŠã¯å ã«æ»ããŠãã ããã
- CLR BookïŒ GitHubãç®æ¬¡
- CLR BookïŒ GitHubãç«
- ãªãªãŒã¹0.5.2ã®æžç±ãPDFïŒ GitHubãªãªãŒã¹
éžæåºæºã3ã€ã®ã°ã«ãŒãã«åããããšãææ¡ããŸãã
- åãçžäºäœçšããåã·ã¹ãã ã®ã¢ãŒããã¯ãã£ã«é¢ããŠã
- ã·ã¹ãã ããã°ã©ããŒãšããŠã®ã¢ãããŒãã®èŠ³ç¹ããïŒããã©ãŒãã³ã¹ã®èŠ³ç¹ããæé©ãªéžæã¯äœã§ããããã
- ãã以å€ã®å Žåã¯ãåã«äžå¯èœã§ãã
ãŠãŒã¶ãŒãèšèšããåãšã³ãã£ãã£ã¯ããã®ç®çãå®å šã«åæ ããå¿ èŠããããŸãã ãããŠãããã¯ãã®ååãŸãã¯çžäºäœçšã€ã³ã¿ãŒãã§ãŒã¹ïŒã¡ãœãããããããã£ïŒã ãã§ãªããéèŠãªã¿ã€ããšåç §ã¿ã€ãã®éžæãããã¢ãŒããã¯ãã£äžã®çç±ã§è¡ãããšãã§ããŸãã åã·ã¹ãã ã®ã¢ãŒããã¯ãã£ã®èŠ³ç¹ãããã¯ã©ã¹ã§ã¯ãªãæ§é ãéžæã§ããçç±ã説æããŸãããã
- æ圱ãããåããã®ç¶æ
ã®ã»ãã³ãã£ãã¯ããŒãã«é¢ããŠäžå€ã§ããå Žå ãããã¯ãã®ç¶æ
ãäœããã®ããã»ã¹ãå®å
šã«åæ ããŠããããäœãã®å€ã§ããããšãæå³ããŸãã ã€ãŸããåã®ã€ã³ã¹ã¿ã³ã¹ã¯å®å
šã«äžå®ã§ãããæ¬è³ªçã«å€æŽããããšã¯ã§ããŸããã ãªãã»ãããæå®ããŠãã®å®æ°ã«åºã¥ããŠåã®å¥ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããããããã£ãæå®ããŠæåããäœæã§ããŸãã ãããããããå€æŽããæš©å©ã¯ãããŸããã æ§é äœãäžå€åã§ããããšãæå³ãããã®ã§ã¯ãªãããšã«æ³šæããŠãã ããã å¿
èŠã«å¿ããŠãã£ãŒã«ããå€æŽã§ããŸãã ããã ãã§ãªãã
ref
ãã©ã¡ãŒã¿ãŒãä»ããŠã¡ãœãããžã®æ§é ãžã®ãªã³ã¯ãæäŸããã¡ãœãããçµäºãããšãã«å€æŽããããã£ãŒã«ããååŸã§ããŸãã ããããç§ã¯å»ºç¯ã®èŠ³ç¹ã«ã€ããŠè©±ããŠããã äŸã§èª¬æããŸãã
-
DateTime
ã¯ãããæç¹ã®æŠå¿µãã«ãã»ã«åããæ§é ã§ãã ãã®ããŒã¿ã¯UInt64
ã®åœ¢åŒã§ä¿åãããŸãããç¹å®ã®æç¹ã®åã ã®ç¹æ§ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã äŸïŒå¹Žãæãæ¥ãæéãåãç§ãããªç§ãããã«ã¯ããã»ããµãŒã®ãã£ãã¯ã ãã ããã«ãã»ã«åãããšããäºå®ã«åºã¥ããŠãæ¬è³ªçã«å¯å€ã«ããããšã¯ã§ããŸããã ç¹å®ã®ç¬éãå€ããããšã¯ã§ããŸããã ç§ã®äººçã®æ¬¡ã®ç¬éãåäŸæ代ã®æé«ã®èªçæ¥ã«çããããšã¯ã§ããŸããã æéã¯å€ãããªãã ãã®ãããããŒã¿åã®éžæã¯ãèªã¿åãå°çšã®å¯Ÿè©±ã€ã³ã¿ãŒãã§ã€ã¹ïŒããããã£ã®å€æŽããšã«æ°ããã€ã³ã¹ã¿ã³ã¹ãæäŸããïŒãæã€ã¯ã©ã¹ããŸãã¯ã€ã³ã¹ã¿ã³ã¹ã®ãã£ãŒã«ããå€æŽããå¯èœæ§ãããã«ãããããããããè¡ãã¹ãã§ã¯ãªãæ§é ã®ããããã«ãªããŸãïŒç¬éã®èª¬æã¯*å€*ã§ãã æ°åã®ããã«ã æ°åã®æ§é ã«å ¥ããŠå€æŽããããšã¯ã§ããŸãããïŒ å ã®1æ¥ããã®ãªãã»ããã§ããå¥ã®æç¹ãååŸããå Žåã¯ãæ§é ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãååŸããã ãã§ãã -
KeyValuePair<TKey, TValue>
ã¯ãæ¥ç¶ãããããŒãšå€ã®ãã¢ã®æŠå¿µãã«ãã»ã«åããæ§é ã§ãã ãã®æ§é ã¯ãèŸæžã®å 容ãäžèŠ§è¡šç€ºãããšãã«ãŠãŒã¶ãŒã«çºè¡ããããã«ã®ã¿äœ¿çšãããããšã«æ³šæããŠãã ããã ãªãã¢ãŒããã¯ãã£ã®èŠ³ç¹ããæ§é ãéžæãããŠããã®ã§ããïŒ çãã¯ç°¡åã§ãããªããªããèŸæž<T>ã®ãã¬ãŒã ã¯ãŒã¯å ã§ã¯ãããŒãšæå³ã¯åé¢ã§ããªãæŠå¿µã ããã§ãã ã¯ããå éšã¯ãã¹ãŠç°ãªããŸãã å éšã«ã¯ãããŒãå€ãšã¯å¥ã«ååšããè€éãªæ§é ããããŸãã ãã ããå€éšãŠãŒã¶ãŒã®å Žåãã€ã³ã¿ã©ã¯ã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ãšããŒã¿æ§é èªäœã®æå³ããèŠããšãããŒãšå€ã®ãã¢ã¯äžå¯åãªæŠå¿µã§ãã å šäœã*å€*ã§ãã ãã®ããŒã§å¥ã®å€ãèŠã€ããå Žåãããã¯ãã¢å šäœãå€æŽãããããšãæå³ããŸãã å€éšãªãã¶ãŒããŒã®å Žåãåå¥ã®ããŒã¯ãªããåå¥ã®å€ããããŸããããããã¯åäžã®å šäœã§ãã ãã®ããããã®å Žåã®æ§é ã¯çæ³çãªãªãã·ã§ã³ã§ãã
-
- èšèšã¿ã€ããå€éšã¿ã€ãã®äžå¯æ¬ ãªéšåã§ããå Žå ã ãããåæã«ãããã¯æ§é çã«äžå¯æ¬ ã§ãã ããªãã¡ å€éšåãã«ãã»ã«åãããã€ã³ã¹ã¿ã³ã¹ãæããšèšãã®ã¯ééã£ãŠããŸãããã«ãã»ã«åããããã®ããã®ãã¹ãŠã®ããããã£ãšãšãã«å€éšã®å®å
šãªéšåã§ããããšã¯çµ¶å¯Ÿã«æ£ããã§ãã éåžžãããã¯å¥ã®æ§é ã®äžéšã§ããæ§é ãèšèšãããšãã«äœ¿çšãããŸãã
- ããšãã°ããã¡ã€ã«ã®ããããŒæ§é ããšãå Žåããããã¡ã€ã«ããå¥ã®ãã¡ã€ã«ãžã®ãªã³ã¯ãäžããã®ã¯äžæ£ã§ãã åæ§ã«ãããããŒã¯
header.txt
ãã¡ã€ã«ã«ãããŸãã ããã¯ãããã¥ã¡ã³ããä»ã®å Žæã«æ¿å ¥ãããšãã«é©ããŠããŸããããã¡ã€ã«ãåã蟌ãã®ã§ã¯ãªãããã¡ã€ã«ã·ã¹ãã ãžã®çžå¯Ÿãªã³ã¯ã«ãã£ãŠè¡ããŸãã è¯ãäŸã¯ãWindows OSã®ã·ã§ãŒãã«ãããã¡ã€ã«ã§ãã ãã ãããã¡ã€ã«ããããŒïŒããšãã°ãç»åãµã€ãºãå§çž®æ¹æ³ãæ®åœ±ãã©ã¡ãŒã¿ãŒãGPS座æšãããã³ãã®ä»ã®ã¡ã¿æ å ±ã瀺ãJPEGãã¡ã€ã«ããããŒïŒã«ã€ããŠè©±ããŠããå Žåã¯ãããããŒã®è§£æã«äœ¿çšãããã¿ã€ããèšèšãããšãã«ãæ§é ã䜿çšãããšéåžžã«äŸ¿å©ã§ãã çµå±ãæ§é å ã®ãã¹ãŠã®ããããŒãèšè¿°ããã®ã§ããã¡ã€ã«å ã®ãã¹ãŠã®ãã£ãŒã«ããšãŸã£ããåãäœçœ®ãã¡ã¢ãªå ã§ååŸã§ããŸãã ãããŠãéçŽå*(Header *)readedBuffer
ãªãã®åçŽãªå®å šã§ãªãå€æ*(Header *)readedBuffer
å®å šã«æºããããããŒã¿æ§é ã
- ããšãã°ããã¡ã€ã«ã®ããããŒæ§é ããšãå Žåããããã¡ã€ã«ããå¥ã®ãã¡ã€ã«ãžã®ãªã³ã¯ãäžããã®ã¯äžæ£ã§ãã åæ§ã«ãããããŒã¯
- åæã«ãåäŸã«ã¯æ¬¡ã®ããããã£ãããããšã«æ³šæããŠãã ããã ã©ã®äŸã«ããäœãã®åäœãç¶æ¿ããããããã£ã¯ãããŸãã ã ããã«ããããã®äŸã¯ãã¹ãŠããããã®ãšã³ãã£ãã£ã®åäœãç¶æ¿ããããšã«ã¯ãŸã£ããæå³ããªãããšã瀺ããŠããŸãã ãããã¯äœãã®åäœãšããŠå®å
šã«èªçµŠèªè¶³ã§ãã
ã³ãŒãã®å¹çã®èŠ³ç¹ããåé¡ãèŠããšãããäžæ¹ã®éžæè¢ããããŸãã
- ã¢ã³ãããŒãžã³ãŒãããæ§é åããŒã¿ãååŸããå¿ èŠãããå Žåã¯ãæ§é ãéžæããå¿ èŠããããŸãã ãŸãã¯ãå®å šã§ãªãã¡ãœããã«ããŒã¿æ§é ãäžããŸãã åç §ã¿ã€ãã¯ããã«ã¯é©ããŠããŸããã
- ã¿ã€ããã¡ãœããåŒã³åºãã§ããŒã¿ã転éããããã«é »ç¹ã«äœ¿çšãããå ŽåïŒæ»ãå€ãŸãã¯ã¡ãœãããã©ã¡ãŒã¿ãŒãšããŠãïŒãç°ãªãå Žæããåãå€ãåç §ããå¿ èŠããªãå Žåãéžæã¯æ§é ã§ãã äŸãšããŠãã¿ãã«ãäžããããšãã§ããŸãã ã¡ãœãããã¿ãã«ãä»ããŠè€æ°ã®å€ãè¿ãå Žåãæ§é äœãšããŠå®£èšãããŠããValueTupleãè¿ãããšãæå³ããŸãã ããªãã¡ æ»ã£ããšãããã®ã¡ãœããã¯ããŒãã«ã¡ã¢ãªãå²ãåœãŠãŸããããã¹ããªãŒã ã®ã¹ã¿ãã¯ã䜿çšããŸããã¡ã¢ãªã®å²ãåœãŠã¯ãŸã£ããã³ã¹ããããããŸããã
- èšèšäžã®ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠããã«ãã©ãã£ãã¯ãäœæããã·ã¹ãã ãèšèšããŠããå Žåã åæã«ãã€ã³ã¹ã¿ã³ã¹èªäœã®ãµã€ãºã¯éåžžã«å°ãããã€ã³ã¹ã¿ã³ã¹ã®åç¶æéã¯éåžžã«çããããåç §åã䜿çšãããšããªããžã§ã¯ãã®ããŒã«ã䜿çšãããããããŒã«ããªãå Žåã¯ããŒãã®å¶åŸ¡ãããªããã€æšãŠãçºçãããããŸãã åæã«ãäžéšã®ãªããžã§ã¯ãã¯å€ãäžä»£ã«ç§»åããGCã®æ²éãåŒãèµ·ãããŸãã ãã®ãããªå Žæã§éèŠãªåã䜿çšãããšïŒå¯èœãªå ŽåïŒãSOHã«äœãå ¥ããªããããããã©ãŒãã³ã¹ãåäžããŸããããã«ãããGCãã¢ã³ããŒããããã¢ã«ãŽãªãºã ãé«éã«åäœããŸãã
äžèšã®ãã¹ãŠãçµã¿åãããŠãæ§é ã®äœ¿çšã«é¢ãããã³ããšã³ã¡ã³ããæäŸã§ããŸãã
- ã³ã¬ã¯ã·ã§ã³ãéžæãããšãã¯ãå éšã«å€§ããªæ§é ããã倧ããªé åãé¿ããå¿ èŠããããŸãã ããã¯ãé åïŒããã³ãã®ã»ãšãã©ïŒã«åºã¥ãããŒã¿æ§é ã«ãé©çšãããŸãã ããã¯ãã©ãŒãžãªããžã§ã¯ãããŒãã®é¢è±ãšãã®æçåã«ã€ãªããå¯èœæ§ããããŸãã æ§é ã«4ãã€ãã®ãã£ãŒã«ããããå Žåã4ãã€ãããããšèšç®ããã ãã§ã¯äžååã§ãã ãŸã£ãããããŸããã 32ãããã·ã¹ãã ã®å Žåãæ§é äœã®åãã£ãŒã«ãã¯4ãã€ãïŒåãã£ãŒã«ãã®ã¢ãã¬ã¹ã¯4ã§å²ãå¿ èŠããããŸãïŒã§ã64ãããã·ã¹ãã ã§ã¯8ãã€ãã§æŽåãããããšãç解ããŠãã ããã ããªãã¡ é åã®ãµã€ãºã¯ãæ§é ã®ãµã€ãºãšã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠãããã©ââãããã©ãŒã ã«äŸåããå¿ èŠããããŸãã 4ãã€ãã®äŸã§ã¯ã85K /ïŒãã£ãŒã«ãããã4ãã32ãã€ã*ãã£ãŒã«ãæ°= 4ïŒ-é åããããŒã®ãµã€ãºïŒãã©ãããã©ãŒã ã«å¿ããŠãé åããšã«çŽ2600ã®èŠçŽ ïŒãã ããåœç¶ãªããããããåé€ããå¿ èŠããããŸãïŒã ãã äœãïŒ ãããªã«ãªãïŒ ãããã10,000åã®èŠçŽ ã®éæ³ã®å®æ°ãããŸãé©åããããã«æãããããããŸããïŒ
- ãŸããããŒã¿ãœãŒã¹ãšããŠååã«å€§ããªãµã€ãºã®æ§é ã䜿çšããããããã£ãŒã«ããšããŠç¹å®ã®ã¯ã©ã¹ã«é 眮ãããšåæã«ãåãã³ããŒã1000ã³ããŒè€è£œãããããšãç解ããããšã䟡å€ããããŸãïŒä¿æããã®ã«äŸ¿å©ã ããã§ãïŒãã¹ãŠãæå ã«ããå ŽåïŒãã¯ã©ã¹ã®åã€ã³ã¹ã¿ã³ã¹ãæ§é ã®ãµã€ãºã ãå¢ãããŸããããã«ãããæçµçã«ç¬¬0äžä»£ãèšåŒµãã第1äžä»£ãŸãã¯2äžä»£ã«ãªããŸããããã«ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãçåœã§ããã ityvaete圌ãã¯ãŒãäžä»£ã®GCã«åéããããšãã§ãããšããäºå® - 1ããªç§ãããªãã¯éåžžã«åœŒããå®éã«æ¬¡ã®1ããããã¯ç¬¬äºã«åŸãããšãã§ããããšã«å€±æãããŸãã å®éãéãã¯äœã§ããïŒ éãã¯ãäžä»£0ã1ããªç§ã§åéãããå Žåã1çªç®ãš2çªç®ã¯éåžžã«é ããæåããæ²äžããããšã§ãã
- ã»ãŒåãçç±ã§ãã¡ãœããåŒã³åºãã®ãã§ãŒã³ãéããŠå€§ããªæ§é ã匷å¶ããããšã¯é¿ããŠãã ããã ãã¹ãŠãçžäºã«åŒã³åºããéå§ãããšããã®ãããªåŒã³åºãã¯ã¹ã¿ãã¯äžã§ããå€ãã®ã¹ããŒã¹ãå æãã
StackOverflowException
ã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ã®å¯¿åœãStackOverflowException
ã§ãã 2çªç®ã®çç±ã¯ããã©ãŒãã³ã¹ã§ãã ã³ããŒãå€ãã»ã©ããã¹ãŠã®åäœãé ããªããŸãã
ãããã£ãŠãäžè¬ã«ãããŒã¿åã®éžæã¯ããªãéèŠãªããã»ã¹ã§ãã å€ãã®å Žåãããã¯ææå°æ©ãªæé©åã«èµ·å ããå¯èœæ§ããããŸãããæšå¥šãããŸããã ãã ããç¶æ³ãäžèšã®ååã«è©²åœããããšãããã£ãŠããå Žåã¯ãéèŠãªã¿ã€ãã®æ¹åã«å®å šã«éžæã§ããŸãã
åºæ¬ã¿ã€ãã¯ãªããžã§ã¯ãã§ãããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããæ©èœã§ãã ãã¯ã·ã³ã°ã
ç§ãã¡ã¯ç«ãšæ°Žã®äž¡æ¹ãçµéšããŸãããã©ããªã€ã³ã¿ãã¥ãŒãåããããŸãã ãããã.NET CLRããŒã ã§ãã ãã ããæ¥ãã§microsoft.comãšå ¥åããŠã空åžã»ã¯ã·ã§ã³ãæ¢ããŠã¯ãããŸãããéã«åããŸãã ãã®è³ªåã«çããŸãããã éèŠãªåã«SyncBlockIndexãžã®åç §ãŸãã¯ä»®æ³ã¡ãœããã®ããŒãã«ãžã®ãã€ã³ã¿ãŒãå«ãŸããŠããªãå Žå...ããã§ã¯ããã¿ãŸãããã©ã®ããã«å
object
ãç¶æ¿ã
object
ãïŒ å®éããã¹ãŠã®ã«ãã³ã«ããã°ãã©ã®ã¿ã€ãã圌ããç¶æ¿ããŠããŸãã æ®å¿µãªããããã®è³ªåã«å¯Ÿããçãã¯1ã€ã®æã«ã¯å«ãŸããŸããããããºã«ã®æåŸã®ããŒã¹ãæçµçã«é©åãªäœçœ®ã«åãŸãããã«ãåã·ã¹ãã ã«ã€ããŠã®ç解ãåŸãããŸãã
ãããã£ãŠãã¡ã¢ãªå ã®éèŠãªã¿ã€ãã®é 眮ã«ã€ããŠããäžåºŠæãåºããŸãããã ã©ãã«ããŠããã©ãã«ããŠãã圌ããããå Žæã«æ€ã蟌ãŸããŸãã 圌ãã¯ãã®äžéšã«ãªããŸãã æ³åŸãå°ããªãŸãã¯å€§ããªãªããžã§ã¯ãã®ããŒãå ã«ãããå€ãèšå®ãããŠããå Žæã«ããããšã䞻匵ããåç §åãšã¯ç°ãªããåžžã«ãªããžã§ã¯ãã®ããããŒãå ã®å Žæãžã®ãªã³ã¯ãé 眮ããŸãã
ãããã£ãŠãèããŠã¿ããšãéèŠãªåã«ã¯ã¡ãœãã
ToString
ã
Equals
ã
GetHashCode
ããããã¯ä»®æ³ã§åå®çŸ©ãããŠããŸãããæå³ã®ããåãç¶æ¿ããŠã¡ãœãããåå®çŸ©ããããšã¯ã§ããŸããã ãªãã§ïŒ åå®çŸ©å¯èœãªã¡ãœããã䜿çšããŠéèŠãªã¿ã€ããå®è¡ããå Žåãã³ãŒã«ã«ãŒãã£ã³ã°ãå®è¡ããä»®æ³ã¡ãœããã®ããŒãã«ãå¿ èŠã«ãªãããã§ãã ãããŠãããã¯ã管çãããŠããªãäžçãžã®æ§é ã®è»¢éã®åé¡ã䌎ããŸããäœåãªãã£ãŒã«ããããã«è¡ããŸãã ãã®çµæãéèŠãªã¿ã€ãã®ã¡ãœããã®èšè¿°ã¯ã©ããã«ããããšãããããŸãããä»®æ³ã¡ãœããã®ããŒãã«ãä»ããŠãããã«çŽæ¥ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã
ããã¯ãç¶æ¿ã®æ¬ åŠã人çºçã§ããããšã瀺åããŠããŸãã
- ãªããžã§ã¯ãããã®ç¶æ¿ããããŸãããçŽæ¥ã§ã¯ãããŸããã
- åºæ¬åã«ã¯ãToStringãEqualsãããã³GetHashCodeããããããããç¬èªã®æ¹æ³ã§æå³ã®ããåã§åäœããŸãããããã®ã¡ãœããã¯ãããããã«ç¬èªã®åäœãæã£ãŠããŸãã ããã¯ãã¡ãœããããªããžã§ã¯ãã«é¢é£ããŠåå®çŸ©ãããããšãæå³ããŸãã
- ããã«ã
object
ã«ãã£ã¹ãããobject
ãå®å šãªæš©éã§ToString
ãEquals
ãããã³GetHashCode
ãåŒã³åºãããšãã§ããŸãã - éèŠãªåã§ã€ã³ã¹ã¿ã³ã¹ã¡ãœãããåŒã³åºãå Žåãã¡ãœãããžã®ã³ããŒã¯ãããŸããã ããªãã¡ ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã®åŒã³åºãã¯ãéçã¡ãœãã
Method(ref structInstance, newInternalFieldValue)
åŒã³åºãã«äŒŒãŠããŸãã å®éãthis
ã¯1ã€ã®äŸå€ãé€ããthis
ã転éããåŒã³åºãã§ããJITã¯ãæ§é èªäœã«ãªãä»®æ³ã¡ãœããã®ããŒãã«ãžã®ãã€ã³ã¿ãŒãé£ã³è¶ããŠãæ§é ã®ãã£ãŒã«ãã«è¿œå ã®ãªãã»ãããäœæããªãããã«ãã¡ãœããã®æ¬äœãã¢ã»ã³ãã«ããå¿ èŠããããŸãã éèŠãªã¿ã€ãã®å Žåãä»ã®å Žæã«ãããŸã ã
ããªãã¡ ããæå³ãã ãŸãããŠããããã§ã¯ãããŸãããã話ã¯ããŠããŸãããåã¯éåžžã«æ¯ãèããç°ãªããŸãããCLRå®è£ ã¬ãã«ã§ã¯ããããã®éãã¯ããã»ã©éèŠã§ã¯ãããŸããã ããããããã«ã€ããŠã¯åŸã§ã
ããã°ã©ã ã«æ¬¡ã®è¡ãèšè¿°ããå ŽåïŒ
var obj = (object)10;
ãã®åŸã
10
çªã®åŠçãåæ¢ããŸãã ãããããã¯ã·ã³ã°ãçºçããŸãïŒããã±ãŒãžã³ã°ã ããªãã¡ åºæ¬ã¯ã©ã¹ãä»ããŠäœæ¥ã§ããããã«ãªããŸãã ãã®ãããªæ©äŒãããã°ãVMTïŒä»®æ³ã¡ãœããã®ããŒãã«ïŒãå©çšå¯èœã«ãªããä»®æ³ã¡ãœããToStringïŒïŒãEqualsãGetHashCodeãå®å šã«åŒã³åºãããšãã§ããŸãã ããã«ãå ã®å€ã¯ã©ãã«ã§ãä¿åã§ãããããã¹ã¿ãã¯äžãã¯ã©ã¹ãã£ãŒã«ããšããŠãã
object
ã¿ã€ãã«è³ããŸã§ããã®çªå·ãžã®ãªã³ã¯ãæ°žé ã«ä¿åããæ©äŒãåŸãããå®éã«ã¯ãã¯ã·ã³ã°ã¯éèŠãªã¿ã€ãã®ã³ããŒãäœæãããžã®ãã€ã³ã¿ãŒãäœæããŸãããªãªãžãã«ã ããªãã¡ ãã¯ã·ã³ã°ãçºçããå ŽåïŒ
- CLRã¯ãïŒToStringãGetHashCodeãEqualsãåŒã³åºãããšãã§ããããã«ïŒéèŠãªåã®+ SyncBlockIndex + VMTæ§é ã®äžã«ããŒãäžã®ã¹ããŒã¹ãå²ãåœãŠãŸãã
- ããã«éèŠãªã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãã³ããŒããŸãã
ãååžã®çæ§ã ãŸãšããªç€ŸäŒã§ã¯ãããã¯èšãã®ãç¿æ £ã§ã¯ãããŸããããéèŠãªã¿ã€ãã®åç §ããŒãžã§ã³ãå ¥æããŸããã ããäžåºŠç¹°ãè¿ããŸãããã¯ã·ã³ã°ãè¡ã£ãåŸãæ§é ã¯**åç §åãšãŸã£ããåãã·ã¹ãã ãã£ãŒã«ãã®ã»ãã**ãååŸããæ¬æ Œçãªåç §åã«ãªããŸããã æ§é ã¯ã¯ã©ã¹ã«ãªããŸããã ãã®çŸè±¡ãDotnetskyã®KulbitãšåŒã³ãŸãããã ãã®ååã¯ãã®ãããªcãªäºæ ã«ãµãããããšæãããŸãã
ãšããã§ãç§ã®èšèã®èª å®ããä¿¡ããããã«ãç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããæ§é ïŒãã®ã€ã³ã¿ãŒãã§ã€ã¹èªäœïŒã䜿çšãããšã©ããªãããç解ããã ãã§ååã§ãã
struct Foo : IBoo { int x; void Boo() { x = 666; } } IBoo boo = new Foo(); boo.Boo();
ãããã£ãŠãFooã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããšããã®å€ã¯åºæ¬çã«ã¹ã¿ãã¯äžã«ãããŸãã 次ã«ããã®å€æ°ãã€ã³ã¿ãŒãã§ã€ã¹åå€æ°ã«å ¥ããŸãã åç §åã®å€æ°ãžã®æ§é ã
boxing
èµ·ãã£ãŠããŸãã ããã åºåã§ã¯ãtype
object
ãååŸããŸããã ããããç§ãã¡ãæã£ãŠããå€æ°ã¯ã€ã³ã¿ãŒãã§ãŒã¹åã§ãã ãããŠãããã¯åå€æãå¿ èŠã§ããããšãæå³ããŸãã ããªãã¡ åŒã³åºãã¯æ¬¡ã®ãããªãã®ã§ãã
IBoo boo = (IBoo)(box_to_object)new Foo(); boo.Boo();
ããªãã¡ ãã®ãããªã³ãŒããæžãããšã¯éåžžã«éå¹ççã§ãã ãªãªãžãã«ã®ä»£ããã«ã³ããŒãå€æŽããã ãã§ãªãïŒ
void Main() { var foo = new Foo(); foo.a = 1; Console.WriteLine(foo.a); // -> 1 IBoo boo = foo; boo.Boo(); // foo.a 10 Console.WriteLine(foo.a); // -> 1 } struct Foo : IBoo { public int a; public void Boo() { a = 10; } } interface IBoo { void Boo(); }
äºåºŠããã®ããã«èŠããŸãã åããŠ-ã³ãŒããèŠããšã ä»ã®èª°ãã®ã³ãŒãã§äœãæ±ã£ãŠããããç¥ãå¿ èŠã¯ãªãã以äžã«
IBoo
ã€ã³ã¿ãŒãã§ãŒã¹ãžã®ãã£ã¹ããèŠã
IBoo
ãŸãã å®éãFooã¯æ§é äœã§ã¯ãªãã¯ã©ã¹ã§ãããšèããããã«ãªããŸãã ããã«ãæ§é ãšã¯ã©ã¹ãžã®èŠèŠçãªåé¢ãå®å šã«ãªããããã€ã³ã¿ãŒãã§ãŒã¹ãä»ããå€æŽã®çµæãfooã«å ¥ããªããã°ãªããªããšããå®å šãªæèŠãåŸãããŸããããã¯ãbooã¯fooã®ã³ããŒã§ããããçºçããŸããã å®éã«ç§ãã¡ã誀解ãããŸãã ç§ã®æèŠã§ã¯ãå€éšã®éçºè ãæ£ããç解ã§ããããã«ããã®ãããªã³ãŒãã«ã¯ã³ã¡ã³ããæäŸããå¿ èŠããããŸãã
以åã®æšè«ã«é¢é£ãã2çªç®ã®èŠ³å¯çµæã¯ã
object
ãã
IBoo
ãžã®åãã£ã¹ããå®è¡ã§ããããšã§ãã ããã¯ãããã¯ã¹åãããææãªåãç¹å¥ãªãã®ã§ã¯ãªããå®éã«ã¯ææãªåã®åç §ããªã¢ã³ãã§ãããšããå¥ã®èšŒæ ã§ãã ãŸãã¯ãå¥ã®è§åºŠããèŠããšãåã·ã¹ãã ã®ãã¹ãŠã®åãåç §ãããŸãã æ§é ãéèŠãªãã®ãšããŠæ±ãããã®äŸ¡å€å šäœããåºè·ãã§ãããšããããšã ãã§ãã C ++ã®äžçã§èšãããã«ããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãéåç §ããŸãã
ããããããªãã¯å察ããããšãã§ããŸãïŒåœŒããèšãã®ã¯ããããã¹ãŠãç§ãèšããšããã§ãããªããããªãã¯ãã®ãããªäœããæžãããšãã§ãããšããããšã§ãïŒ
var referenceToInteger = (IInt32)10;
ãããŠã
object
ã ãã§ãªããããã¯ãããæå³ã®ããåãžã®åä»ãåç §ãååŸã
object
ã ããããããã¯éèŠãªã¿ã€ããå人ã®å šäœã®ã¢ã€ãã¢ãå°ç¡ãã«ããã§ãããã ãããŠãäž»ãªã¢ã€ãã¢ã¯äŸ¡å€ã®å®å šæ§ã§ããããã®ç¹æ§ã«åºã¥ããŠåªããæé©åãè¡ãããšãã§ããŸãã ã ããã座ã£ãŠã¯ãããŸããïŒ ãã®ã¢ã€ãã¢ãç Žå£ããŸãããïŒ
public sealed class Boxed<T> where T : struct { public T Value; [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(object obj) { return Value.Equals(obj); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override string ToString() { return Value.ToString(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() { return Value.GetHashCode(); } }
äœãåŸãã®ïŒ ãã¯ã·ã³ã°ã®å®å šã«é¡äŒŒãããã®ãåŸãããŸããã ããããã€ã³ã¹ã¿ã³ã¹ã¡ãœãããåŒã³åºãããšã§ãã³ã³ãã³ããå€æŽã§ããããã«ãªããŸããã ãããŠããã®ããŒã¿æ§é ãžã®ãªã³ã¯ãæã£ãŠããå šå¡ããããã®å€æŽãåãåããŸãã
var typedBoxing = new Boxed<int> { Value = 10 }; var pureBoxing = (object)10;
ããªããèŠãæåã®ãªãã·ã§ã³ã¯ãããäžç¢ºãã«èŠããŸãã ç¿æ £çãªåãã£ã¹ãã®ä»£ããã«ãç§ãã¡ã¯åçä¹±ã§ãã ã±ãŒã¹ã2è¡ç®ãã©ããã æ¥æ¬ã®è©©ãšããŠã®ã©ã³ããã¯ã ãã ããå®éã«ã¯ã»ãŒå®å šã«åäžã§ãã å¯äžã®éãã¯ãéåžžã®ãããã³ã°äžã«ãããŒãã«ã¡ã¢ãªãå²ãåœãŠãåŸãã¡ã¢ãªã®ãŒãã¯ãªã¢ãè¡ãããªãããšã§ããã¡ã¢ãªã¯å¿ èŠãªæ§é ãããã«åŠçããŸãã äžæ¹ãæåã®ããªã¢ã³ãã§ã¯ã¯ãªãŒãã³ã°ãè¡ãããŸãã ãã®ãããåœç€Ÿã®ãªãã·ã§ã³ã¯åŸæ¥ã®ããã±ãŒãžã³ã°ããã10ïŒ é ããªããŸãã
ãããä»ã§ã¯ãããã¯ãããå€ã«å¯ŸããŠããã€ãã®ã¡ãœãããåŒã³åºãããšãã§ããŸãã
struct Foo { public int x; public void ChangeTo(int newx) { x = newx; } } var boxed = new Boxed<Foo> { Value = new Foo { x = 5 } }; boxed.Value.ChangeTo(10); var unboxed = boxed.Value;
æ°ããããŒã«ãå ¥æããŸãããããããã©ãããã°ããã®ããŸã ããããŸããã æšè«ã«ãã£ãŠçããååŸããŸãããïŒ
- Boxed <T>ã¿ã€ãã¯ãéåžžã®ã¿ã€ããšåºæ¬çã«åãã§ããããŒãã«ã¡ã¢ãªãå²ãåœãŠãããã«å€ãäžããããçš®ã®unboxãè¡ãããšã§ãããååŸã§ããããã«ããŸãã
- åæ§ã«ãããã¯ãããæ§é ãžã®åç §ã倱ããšãGCã¯ãããåéããŸãã
- ãã ããããã¯åã§äœæ¥ããæ©äŒããããŸããã¡ãœãããåŒã³åºããŸãã
- ãŸããSOH / LOHã®éèŠãªã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãå¥ã®ã€ã³ã¹ã¿ã³ã¹ã«çœ®ãæããããšãã§ããŸãã ãããŸã§ã¯ã§ããŸããã§ããã
unboxing
ãè¡ããæ§é ãå¥ã®ãã®ã«å€æŽããunboxing
åãå ã«æ»ããŠãæ¶è²»è ã«æ°ãããªã³ã¯ãé åžããå¿ èŠããããŸããã - ãŸããããã±ãŒãžã³ã°ã®äž»ãªåé¡ç¹ãèããŠã¿ãŸãããã ã¡ã¢ãªã«ãã©ãã£ãã¯ãäœæããŸãã ç解ã§ããªãæ°ã®ãªããžã§ã¯ãã®ãã©ãã£ãã¯ããã®äžéšã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã§åé¡ãçºçãã第1äžä»£ãŸã§åç¶ã§ããŸããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã§åé¡ãçºçããŸãã ãããŠãçåœã®ãªããžã§ã¯ãã®ãã©ãã£ãã¯ãããå Žåãé ã«æµ®ãã¶æåã®è§£æ±ºçã¯ãã«ã§ãã .
var pool = new Pool<Boxed<Foo>>(maxCount:1000); var boxed = pool.Box(10); boxed.Value=70; // use boxed value here pool.Free(boxed);
ããªãã¡ , . , . ,
boxed
, . GC.
:
- â , : ;
- â , , : , . , , . , , GC ;
,
static unsafe void Main() { // boxed int object boxed = 10; // VMT var address = (void**)EntityPtr.ToPointerWithOffset(boxed); unsafe { // Virtual Methods Table var structVmt = typeof(SimpleIntHolder).TypeHandle.Value.ToPointer(); // VMT , Heap VMT SimpleIntHolder, Int *address = structVmt; } var structure = (IGetterByInterface)boxed; Console.WriteLine(structure.GetByInterface()); } interface IGetterByInterface { int GetByInterface(); } struct SimpleIntHolder : IGetterByInterface { public int value; int IGetterByInterface.GetByInterface() { return value; } }
, . github . boxing int reference type. :
- boxing
- ( VMT Int32)
- VMT SimpleIntHolder
- VMT VMT
- unbox
- â , Int32, .
, , .
- CLR Book: GitHub
- 0.5.0 , PDF: GitHub Release