芪æãªãèªè
ã®çãããããã«ã¡ã¯ïŒ
å°ãåã«ãã
High-Performance .NET codeãæžã ããšããæ¬ã®äœæ¥ãéå§ããŸããããã®æ¬ã¯ãŸã ãã·ã¢èªã«ç¿»èš³ãããŠããŸãããããŸããªã1幎ã«ãªãã§ãããã
ãã¡ããããã®ãããªæ¬ããã§ã«åŒçšãããŠããããšã¯é©ãã§ã¯ãããŸããã§ããããå°æ¬ãããŠããèè
ãã³ã»ã¯ããœã³ã¯ãç« ã®1ã€ã«åºã¥ããŠCodeproject Webãµã€ãã«
èšäºå
šäœãæçš¿
ãããããŸã
ã ã æ®å¿µãªããããã®è³æã®éã¯habropublishingã«ã¯å€§ããããŸãããæ¬ã®è³æãè©äŸ¡ã§ããããã«èšäºã®æåã®éšåã翻蚳ããããšã«ããŸããã 調æ»ãèªãã§åå ããŠãã ããã ããã«ã2çªç®ã®éšåã翻蚳ããããšããå§ãããŸã-ã³ã¡ã³ããèšå
¥ããŠãç§ãã¡ã¯ããªãã®åžæãèæ
®ã«å
¥ããããšããŸãã
ã³ã³ããã¹ããã®èšäºã¯ãç§ã®èæž ãHigh-Performance .NET Codeã®äœæãã®ç¬¬5ç« ã«åºã¥ããŠããŸãã
ã¯ããã«ãã®èšäºã§ã¯ãã³ãŒããšã¿ã€ããã¶ã€ã³ãèšè¿°ããäžè¬çãªååã«ã€ããŠèª¬æããŸãã .NETãã©ãããã©ãŒã ã§ã¯ãããŸããŸãªã·ããªãªãå®è£
ããæ©äŒãããããããã®ããã€ããããããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããªãå Žåããããæ·±å»ã«å°ç¡ãã«ãããã®ããããŸãã ç¹å®ã®ã·ããªãªã¯è¯ãããšãæªãããšããããŸãããããããäœã§ãããã ãã§ãã åç¶æ³ã«æé©ãªãœãªã¥ãŒã·ã§ã³ãéžæããå¿
èŠããããŸãã
ãã®èšäºã®æ ¹åºã«ããäžè¬ååãå®åŒåããããšãããšã次ã®ããã«ãªããŸãã
æ·±ãããã©ãŒãã³ã¹ã®æé©åã¯ãå€ãã®å ŽåããœãããŠã§ã¢ã®æœè±¡åãå£ããŸããããã¯ãéåžžã«é«ãããã©ãŒãã³ã¹ãéæããããšããå Žåããã¹ãŠã®ã¬ãã«ã§å®è£
ã®è©³çŽ°ãç解ããå¿
èŠããããå Žåã«ãã£ãŠã¯ãããã®åŸ®åŠããè©ŠããŠã¿ãå¿
èŠãããããšãæå³ããŸãã ãããã®è©³çŽ°ã®å€ãã¯ããã®èšäºã§èª¬æãããŠããŸãã
ã¯ã©ã¹ãšæ§é ã®æ¯èŒã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã¯åžžã«ããŒãäžã«å²ãåœãŠããããããã®ã€ã³ã¹ã¿ã³ã¹ãžã®ã¢ã¯ã»ã¹ã¯ãã€ã³ã¿ãŒã®éåç
§ã«ãã£ãŠè¡ãããŸãã ãã€ã³ã¿ãŒã®ã³ããŒïŒ4ãŸãã¯8ãã€ãïŒã§ããããããããã転éããã®ã¯å®äŸ¡ã§ãã ãã ãããªããžã§ã¯ãã«ã¯ããã€ãã®åºå®ãªãŒããŒãããããããŸãã32ãããããã»ã¹ã§ã¯8ãã€ãã64ãããããã»ã¹ã§ã¯16ãã€ãã§ãã ãããã®ã³ã¹ãã«ã¯ãã¡ãœããããŒãã«ãžã®ãã€ã³ã¿ãšåæãããã¯ãã£ãŒã«ããå«ãŸããŸãã ãã£ãŒã«ããªãã§ãªããžã§ã¯ããäœæãããããã¬ã§è¡šç€ºãããšãå®éã«ã¯ãã®ãµã€ãºã¯8ãã€ãã§ã¯ãªã12ãã€ãã§ããããšãããããŸãã 64ãããããã»ã¹ã®å Žåããªããžã§ã¯ãã®ãµã€ãºã¯24ãã€ãã«ãªããŸãã å®éã«ã¯ãæå°ãµã€ãºã¯ã¡ã¢ãªãããã¯ã®ã¢ã©ã€ã¡ã³ãã«äŸåããŸãã 幞ããªããšã«ããããã®ãäœåãªã4ãã€ãã¯ãã£ãŒã«ãã«ãã£ãŠäœ¿çšãããŸãã
æ§é äœæ§é ã¯ãªãŒããŒãããã䌎ããã䜿çšããã¡ã¢ãªã®ãµã€ãºã¯ãã®ãã¹ãŠã®ãã£ãŒã«ãã®ãµã€ãºã®åèšã§ãã
æ§é äœãã¡ãœããå
ã§ããŒã«ã«å€æ°ãšããŠå®£èšãããŠããå Žåã
æ§é äœã¯ã¹ã¿ãã¯ã«å²ãåœãŠãããŸãã
æ§é äœãã¯ã©ã¹ã®äžéšãšããŠå®£èšãããŠããå Žåã
æ§é äœã¡ã¢ãªã¯ããã®ã¯ã©ã¹ãå æããã¡ã¢ãªãã©ã°ã¡ã³ãã®äžéšã«ãªããŸãïŒãããã£ãŠãããŒãäžã«ãããŸãïŒã
æ§é äœãã¡ãœããã«æž¡ããšã
æ§é äœã¯ãã€ãããšã«é çªã«ã³ããŒãããŸãã ããŒãäžã«ãªããããæ§é äœãå²ãåœãŠãŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯éå§ãããŸããã
ãããã£ãŠãããã§åŠ¥åããå¿
èŠããããŸãã æ§é ã®æ倧ãµã€ãºã«é¢ããããŸããŸãªæšå¥šäºé
ã«åºããããããããŸããããç§ã¯ç¹å®ã®æ°åã«å·çããŸããã ååãšããŠã
æ§é äœã®ãµã€ãºãéåžžã«å°ããä¿ã€ããšãã
å§ãããŸã ãç¹ã«ãã®æ§é äœãååŸã«æž¡ãå Žåã¯ãæ§é äœãåç
§æž¡ãããããšãã§ããããããµã€ãºã«å€§ããªåé¡ã¯çããŸããã ãã®ææ³ãæçšãã©ãããèªä¿¡ãæã£ãŠå€æããå¯äžã®æ¹æ³ã¯ã䜿çšãã¿ãŒã³ã泚ææ·±ãèŠãŠããããã¡ã€ãªã³ã°ãå®è¡ããããšã§ãã
ç¶æ³ã«ãã£ãŠã¯ãå¹æã¯åçã«ç°ãªãå ŽåããããŸãã åäžã®ãªããžã§ã¯ãã®ã³ã¹ãã®äŸ¡å€ã¯ãããããã§ããããã«èŠããŸããããªããžã§ã¯ãã®é
åãæ€èšããæ§é ã®é
åãšæ¯èŒããŠã¿ãŠãã ããã ããŒã¿æ§é ã«16ãã€ãã®ããŒã¿ãå«ãŸããé
åã®é·ãã1,000,000ã§ããã32ãããã·ã¹ãã ã§äœæ¥ãããšããŸãã
ãªããžã§ã¯ãã®é
åã®å Žåãåèšã¹ããŒã¹æ¶è²»éã¯æ¬¡ã®ãšããã§ãã
12ãã€ãã®é
åãªãŒããŒããã+
ïŒãã€ã³ã¿ãŒãµã€ãº4ãã€ãÃ1,000,000ïŒ+
ïŒïŒãªãŒããŒããã8ãã€ã+ 16ãã€ãã®ããŒã¿ïŒÃ1,000,000ïŒ
= 28 MB
æ§é äœã®é
åã§ã¯ãæ ¹æ¬çã«ç°ãªãçµæãåŸãããŸãã
12ãã€ãã®é
åãªãŒããŒããã+
ïŒ16ãã€ãã®ããŒã¿Ã1,000,000ïŒ
= 16 MB
64ãããããã»ã¹ã®å Žåããªããžã§ã¯ãã®é
åã¯40 MB以äžãå æããŸããã
æ§é äœé
åã¯16 MBããå¿
èŠãšããŸããã
ã芧ã®ãšããã
æ§é äœé
åã§ã¯ããªããžã§ã¯ãã®é
åãããåãéã®ããŒã¿ãã¡ã¢ãªãæ¶è²»ããŸããã ãªããžã§ã¯ãã®äœ¿çšã«é¢é£ããã³ã¹ãã«å ããŠãã¡ã¢ãªè² è·ãé«ããªãããšã§èª¬æããããããéäžçãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãè¡ãããŸãã
ã¹ããŒã¹ã®äœ¿çšã«å ããŠãããã»ããµãŒã®å¹çã®åé¡ããããŸãã ããã»ããµã«ã¯ããã€ãã®ã¬ãã«ã®ãã£ãã·ã¥ããããŸãã ããã»ããµã«æãè¿ããã®ã¯éåžžã«å°ããã§ãããéåžžã«é«éã«åäœããã·ãŒã±ã³ã·ã£ã«ã¢ã¯ã»ã¹çšã«æé©åãããŠããŸãã
æ§é äœé
åã«ã¯ãã¡ã¢ãªå
ã«é çªã«é
眮ãããå€ãã®å€ãå«ãŸããŸãã æ§é äœé
åå
ã®èŠçŽ ãžã®ã¢ã¯ã»ã¹ã¯éåžžã«ç°¡åã§ãã æ£ãããšã³ããªãèŠã€ãããšããã§ã«æ£ããå€ããããŸãã ãããã£ãŠã倧ããªé
åãå埩åŠçããå Žåãã¢ã¯ã»ã¹é床ã«å€§ããªéããçããå¯èœæ§ããããŸãã å€ãæ¢ã«ããã»ããµãã£ãã·ã¥ã«ããå ŽåãRAMã«ããå Žåããã1æ¡éãã¢ã¯ã»ã¹ã§ããŸãã
ãªããžã§ã¯ãé
åã®èŠçŽ ã«ã¢ã¯ã»ã¹ããã«ã¯ãé
åã®ã¡ã¢ãªã«ã¢ã¯ã»ã¹ãããã®èŠçŽ ãžã®ãã€ã³ã¿ãéæ¥åç
§ããå¿
èŠããããŸãããã®èŠçŽ ã¯ããŒãå
ã®ã©ãã«ã§ãé
眮ã§ããŸãã ãªããžã§ã¯ãé
åã®åæã«ã¯ãè¿œå ã®ãã€ã³ã¿ãŒã®éåç
§ãããŒãã«æ²¿ã£ãããžã£ã³ãããããã³ããã»ããµãã£ãã·ã¥ã®æ¯èŒçé »ç¹ãªç©ºåãå«ãŸããå¿
èŠãªããŒã¿ãç¡é§ã«ãªãå¯èœæ§ããããŸãã
å€ãã®å Žåãããã»ããµã¬ãã«ãšã¡ã¢ãªã®äž¡æ¹ã§ãã®ãããªã³ã¹ããçºçããªãããšããæ§é ãåªå
ããäž»ãªçç±ã§ãã ãã®ææ³ãè³¢æã«äœ¿çšãããšãã¡ã¢ãªã®å±ææ§ãåäžãããããããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã
æ§é ã¯åžžã«å€ã«ãã£ãŠã³ããŒããããããäžæ³šæã«ããèå³æ·±ãäœçœ®ã«ç§»åããå¯èœæ§ããããŸãã ããšãã°ã次ã®ã³ãŒãã¯ãšã©ãŒä»ãã§èšè¿°ãããŠãããã³ã³ãã€ã«ãããŸããã
struct Point { public int x; public int y; } public static void Main() { List<Point> points = new List<Point>(); points.Add(new Point() { x = 1, y = 2 }); points[0].x = 3; }
åé¡ã¯ããªã¹ãå
ã®æ¢åã®
ãã€ã³ããå€æŽããããšããŠããæåŸã®è¡ã§çºçããŸãã
ãã€ã³ã[0 ]ãåŒã³åºããšãå
ã®å€ã®ã³ããŒãè¿ãããä»ã®ã©ãã«ãä¿åãããªããããããã¯äžå¯èœã§ãã
Pointãå€æŽããæ£ããæ¹æ³ïŒ
Point p = points[0]; px = 3; points[0] = p;
ãã ããæ§é ãå€æŽã§ããªãããã«ããããã«ãããã«å³ããããªã·ãŒãå®è£
ããããšããå§ãããŸãã æ§é ãäœæãããšããã®ãããªæ§é ã¯æ°ããå€ãååŸã§ããªããªããŸãã ãã®å Žåãäžèšã®ç¶æ³ã¯ååçã«äžå¯èœã«ãªããæ§é ã«é¢ãããã¹ãŠã®äœæ¥ãç°¡çŽ åãããŸãã
åè¿°ã®ããã«ãæ§é ã¯ã³ã³ãã¯ãã§ãããããã³ããŒã«å€ãã®æéãè²»ããå¿
èŠã¯ãããŸãããã倧ããªæ§é ã䜿çšããå¿
èŠãããå ŽåããããŸãã åæ¥ããã»ã¹ã«é¢ããå€ãã®è©³çŽ°ã远跡ããããªããžã§ã¯ããèããŠãã ãã-äŸãã°ãå€ãã®ã¿ã€ã ã¹ã¿ã³ããèšå®ãããŸãã
class Order { public DateTime ReceivedTime {get;set;} public DateTime AcknowledgeTime {get;set;} public DateTime ProcessBeginTime {get;set;} public DateTime WarehouseReceiveTime {get;set;} public DateTime WarehouseRunnerReceiveTime {get;set;} public DateTime WarehouseRunnerCompletionTime {get;set;} public DateTime PackingBeginTime {get;set;} public DateTime PackingEndTime {get;set;} public DateTime LabelPrintTime {get;set;} public DateTime CarrierNotifyTime {get;set;} public DateTime ProcessEndTime {get;set;} public DateTime EmailSentToCustomerTime {get;set;} public DateTime CarrerPickupTime {get;set;}
ã³ãŒããç°¡çŽ åããã«ã¯ããããã®ã©ãã«ãããããç¬èªã®ãµãæ§é ã§éžæãããšäŸ¿å©ã§ãããããã®ã©ãã«ã¯ã次ã®ããã«Orderã¯ã©ã¹ã®ã³ãŒãããåŒãç¶ãå©çšã§ããŸãã
Order order = new Order(); Order.Times.ReceivedTime = DateTime.UtcNow;
ãããã®äžäœæ§é ã¯ãã¹ãŠãå¥ã®ã¯ã©ã¹ã«ç§»åã§ããŸãã
class OrderTimes { public DateTime ReceivedTime {get;set;} public DateTime AcknowledgeTime {get;set;} public DateTime ProcessBeginTime {get;set;} public DateTime WarehouseReceiveTime {get;set;} public DateTime WarehouseRunnerReceiveTime {get;set;} public DateTime WarehouseRunnerCompletionTime {get;set;} public DateTime PackingBeginTime {get;set;} public DateTime PackingEndTime {get;set;} public DateTime LabelPrintTime {get;set;} public DateTime CarrierNotifyTime {get;set;} public DateTime ProcessEndTime {get;set;} public DateTime EmailSentToCustomerTime {get;set;} public DateTime CarrerPickupTime {get;set;} } class Order { public OrderTimes Times; }
ãã ããããã«ãããå
Orderãªããžã§ã¯ãã«12ãŸãã¯24ãã€ãã®ã³ã¹ããè¿œå ã§çºçããŸãã
OrderTimesãªããžã§ã¯ãå
šäœãããŸããŸãªã¡ãœããã«
æž¡ãå¿
èŠãããå Žåããã®ãããªãªãŒããŒãããã¯ããããæ£åœåãããŸããããªã
Orderãªããžã§ã¯ãå
šäœãžã®åç
§ãæž¡ããªãã®ã§ããïŒ åæã«æ°åã®
Orderãªããžã§ã¯ããåŠçãããšãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã倧å¹
ã«å¢å ããŸãã ããã«ãè¿œå ã®éåç
§æäœãã¡ã¢ãªã«æ ŒçŽãããŸãã
OrderTimesæ§é ãäœæããŠãã ããã
Orderãªããžã§ã¯ãã®ããããã£ïŒããšãã°ã
order.Times.ReceivedTime ïŒã䜿çšããŠ
OrderTimesæ§é
ã®åã
ã®ããããã£ã«
ã¢ã¯ã»ã¹ããŠããæ§é ã®ã³ããŒã¯è¡ãããŸããïŒ.NETã§ã¯ããã®å¯èœæ§ã®é«ãã·ããªãªã¯ç¹å¥ã«æé©åãããŠããŸãïŒã ãããã£ãŠã
OrderTimesã®æ§é ã¯ãããã«äžäœæ§é ããªããã®ããã«ãåºæ¬çã«
Orderã¯ã©ã¹ã«å²ãåœãŠãããã¡ã¢ãªã®äžéšã§ãã ã³ãŒãèªäœãããæ£ç¢ºã«ãªããŸãã
ãã®ææ³ã¯äžå€æ§é ã®ååã«éåããŸããããããã§ã®ç§trickã¯æ¬¡ã®ãšããã§ããOrderTimesæ§é ã®ãã£ãŒã«ãã¯ãOrderãªããžã§ã¯ãã®ãã£ãŒã«ãã§ãããã®ããã«åŠçããŸãã OrderTimesæ§é ããšã³ãã£ãã£å
šäœãšããŠæž¡ãå¿
èŠããªãå Žåãææ¡ãããã¡ã«ããºã ã¯çŽç²ã«çµç¹çãªãã®ã§ãã
æ§é äœã®Equalsããã³GetHashCodeã¡ãœããã®ãªãŒããŒã©ã€ãæ§é ã䜿çšããå Žåã
Equalsã¡ãœãããš
GetHashCodeã¡ãœããããªãŒããŒã©ã€ãããããšãéåžžã«éèŠã§ãã ãããè¡ãããªãå Žåãããã©ã«ãããŒãžã§ã³ãååŸãããŸãããããã¯æ±ºããŠé«æ§èœã«è²¢ç®ããŸããã ãããã©ãã»ã©æªãããè©äŸ¡ããã«ã¯ãäžéèšèªãã¥ãŒã¢ãŒãéãã
ValueType.Equalsã¡ãœããã®ã³ãŒããèŠãŠãã ããã æ§é ã®ãã¹ãŠã®ãã£ãŒã«ãã®åå°ã«é¢é£ä»ããããŠããŸãã ãã ããããã¯ãã€ããªäºæã¿ã€ãã®æé©åã§ãã ãã€ããªäºæïŒblittableïŒã¯ããããŒãžã³ãŒããšã¢ã³ãããŒãžã³ãŒãã®äž¡æ¹ã§ã¡ã¢ãªå
ã§åãè¡šçŸãæã€ã¿ã€ãã§ãã ãããã«ã¯ãããªããã£ãæ°å€åïŒããšãã°ã
Int32 ã
UInt64ãå«ãŸããŸãããããªããã£ãã§ã¯ãªã
Decimalã¯å«ãŸããŸããïŒããã³
IntPtr / UIntPtrã®ã¿ãå«ãŸããŸãã æ§é ããã€ããªäºæåã®ã¿ã§æ§æãããŠããå ŽåãEqualså®è£
ã¯ãæ§é å
šäœã§ã¡ã¢ãªã®ãã€ãæ¯èŒãå®éã«å®è¡ã§ããŸãã ãã®ãããªãããŸãããé¿ããç¬èªã®
Equalsã¡ãœãããå®è£
ããŠãã ããã
EqualsïŒãã®ä»ã®ãªããžã§ã¯ãïŒãåçŽã«ãªãŒããŒã©ã€ãããå Žåããã®ã¡ãœããã¯å€åã®å€æãšããã±ãŒãžåã«é¢é£ä»ããããŠãããããäŸç¶ãšããŠäžåœã«äœãããã©ãŒãã³ã¹ãåŸãããŸãã 代ããã«ã
EqualsïŒT otherïŒãå®è£
ããŸã
ïŒ Tã¯æ§é äœã®ã¿ã€ãã§ãïŒã IEquatableã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã®ããã«èšèšãããŠããããã¹ãŠã®æ§é äœãå®è£
ããå¿
èŠããããŸãã ã³ã³ãã€ã©ã¯ãå¯èœã§ããã°ããã匷ãåä»ããããããŒãžã§ã³ãåžžã«åªå
ããŸãã äŸãèããŠã¿ãŸãããïŒ
struct Vector : IEquatable<Vector> { public int X { get; set; } public int Y { get; set; } public int Z { get; set; } public int Magnitude { get; set; } public override bool Equals(object obj) { if (obj == null) { return false; } if (obj.GetType() != this.GetType()) { return false; } return this.Equals((Vector)obj); } public bool Equals(Vector other) { return this.X == other.X && this.Y == other.Y && this.Z == other.Z && this.Magnitude == other.Magnitude; } public override int GetHashCode() { return X ^ Y ^ Z ^ Magnitude; } }
åãIEquatableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããŠããå Žåãæ±çš.NETã³ã¬ã¯ã·ã§ã³ã¯ãããæ€åºããããå¹ççãªæ€çŽ¢ãšäžŠã¹æ¿ãã«äœ¿çšããŸãã
ãŸããå€ã®ã¿ã€ãã«== andïŒ=æŒç®åã䜿çšãã
æ¢åã®EqualsïŒTïŒã¡ãœãããåŒã³åºãããã«åŒ·å¶ããããšãã§ããŸã
ãæ§é ãæ¯èŒãããã³ã¬ã¯ã·ã§ã³ã«å
¥ãããããªãå Žåã§ãããããã®ã¡ãœãããå®è£
ããããšããå§ãããŸãã ããããå°æ¥ã©ã®ããã«äœ¿çšãããããæšæž¬ããããšã¯æ±ºããŠãããŸããããŸããã¡ãœããã®äœæã«ã¯æ°åãããããããäžéèšèªã®ãã€ããèªã¿åããŸãã
ã¯ã©ã¹ã®
Equalsã¡ãœãããš
GetHashCodeã¡ãœããããªãŒããŒã©ã€ãããããšã¯ããã»ã©éèŠã§ã¯ãããŸããããã®å Žåããªããžã§ã¯ããžã®åç
§ã«åºã¥ããŠåçæ§ãèšç®ããã ãã ããã§ãã ã³ãŒãã«ãããã®ã¡ãœããã®æšæºå®è£
ãååã«ãããšæãããå Žåã¯ãå€æŽããªãã§ãã ããã
ä»®æ³ã¡ãœãããšã·ãŒã«ãã¯ã©ã¹ããã©ã«ãã§ã¯ããäžãäžã«åããŠãã¡ãœãããä»®æ³åããªãã§ãã ããã ãã ããããã°ã©ã ã®äžè²«ããèšèšã®ããã«ä»®æ³ã¡ãœãããå¿
èŠãªå Žåã¯ãããããåé€ããŠç¡çãããªãã§ãã ããã
ã¡ãœãããä»®æ³åãããšãåçã³ã³ãã€ã©ãŒåŽããã®ããã€ãã®æé©åãç¹ã«ã¡ãœããã®åã蟌ã¿ãã§ããªããªããŸãã ã¡ãœããã¯ãã©ã®ã¡ãœãããåŒã³åºãããããã³ã³ãã€ã©ã100ïŒ
ç¥ã£ãŠããå Žåã«ã®ã¿åã蟌ãããšãã§ããŸãã ã¡ãœãããä»®æ³ãšããŠããŒã¯ãããšããã®ãããªç¢ºå®æ§ã倱ãããŸããããã®ãããªæé©åãäžæ¢ããããåŸãªãä»ã®èŠå ããããŸãã
ä»®æ³ã¡ãœããã¯ãæŠå¿µçã«ã·ãŒã«ã¯ã©ã¹ã«è¿ããããšãã°æ¬¡ã®ããã«ãªããŸãã
public sealed class MyClass {}
å°å°æžã¿ãšããŠããŒã¯ãããã¯ã©ã¹ã¯ãä»ã®ã¯ã©ã¹ããã®ã¯ã©ã¹ããç¶æ¿ã§ããªãããšã宣èšããŸãã
çè«çã«ã¯ãåçã³ã³ãã€ã©ã¯ãã®æ
å ±ã䜿çšããŠãåã蟌ã¿ã«ãã£ãšé¢äžããããšãã§ããŸãããçŸåšããã¯è¡ãããŠããŸããã å¯èœã§ããã°ãããã©ã«ãã§ã¯ã©ã¹ãå°å°æžã¿ãšããŠå®£èšããå¿
èŠã§ãªãéãããã©ã«ãã®ã¡ãœãããä»®æ³åããªãã§ãã ããã ãã®å Žåãã³ãŒãã¯åçã³ã³ãã€ã©ãŒã®çŸåšã®æé©åã ãã§ãªããå°æ¥å¯èœãªæé©åã«ãé©å¿ãããŸãã
ããŸããŸãªç¶æ³ãç¹ã«çµç¹å€ã§äœ¿çšããäºå®ã®ã¯ã©ã¹ã©ã€ãã©ãªãäœæããå Žåã¯ã泚æãå¿
èŠã§ãã ãã®å Žåãä»®æ³APIã®ååšã¯ãæäœéã®ããã©ãŒãã³ã¹ãããéèŠã§ããå¯èœæ§ããããŸãããã®ãããã©ã€ãã©ãªã¯åå©çšãšãã¥ãŒãã³ã°ã«äŸ¿å©ã§ãã ãã ãã瀟å
ã®ããŒãºã«åãããŠã³ãŒããäœæããé »ç¹ã«å€æŽããå Žåã¯ãããã©ãŒãã³ã¹ãæ¹åããŠãã ããã
ã€ã³ã¿ãŒãã§ãŒã¹ãã£ã¹ãããã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¡ãœãããæåã«åŒã³åºããšãã.NETã¯åŒã³åºããè¡ãã¿ã€ããšã¡ãœããã決å®ããå¿
èŠããããŸãã ãŸããã¹ã¿ããžã®åŒã³åºããè¡ãããŸããã¹ã¿ãã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããªããžã§ã¯ããæäœãããšãã«åŒã³åºãããã¡ãœãããèŠã€ããŸãã ãããæ°åçºçãããšãCLRã¯åãç¹å®ã®åãåžžã«åŒã³åºãããããšããåŠç¿ãããã¹ã¿ããä»ãããã®éæ¥çãªåŒã³åºãã¯ãç®çã®ã¡ãœãããåŒã³åºãå°æ°ã®ã¢ã»ã³ããªåœä»€ã®ã¿ã§æ§æãããã¹ã¿ãã«åæžãããŸãã ãã®ãããªåœä»€ã®ã°ã«ãŒãã¯ã1ã€ã®ã¿ã€ãã®ã¡ãœãããåŒã³åºãæ¹æ³ãç¥ã£ãŠããããããåçžã¹ã¿ãããšåŒã°ããŸãã ããã¯ãåŒã³åºãã®å Žæãåžžã«åãåã®ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœãããåŒã³åºãå Žåã«çæ³çã§ãã
åçžã¹ã¿ãã䜿çšãããšãäœãåé¡ãçºçãããã©ãããæ€åºããããšãã§ããŸãã ããæç¹ã§åŒã³åºãå
ãå¥ã®ã¿ã€ãã®ã¡ãœããã䜿çšãå§ãããšãCLRã¯æçµçã«ã¹ã¿ããæ°ããã¿ã€ãã®å¥ã®åçžã¹ã¿ãã«çœ®ãæããŸãã
ç¶æ³ãããã«è€éã§ãããã€ãã®ã¿ã€ããé¢ä¿ããäºæž¬ãå°é£ãªå ŽåïŒããšãã°ãã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã®é
åããããããã®é
åã«ããã€ãã®ç¹å®ã®ã¿ã€ããããå ŽåïŒãã¹ã¿ãã¯ããªã¢ãŒãã£ãã¯ãªãã®ã«å€ãããã©ã®ã¡ãœãããéžæã§ããããã«ããããã·ã¥ããŒãã«ã䜿çšããŸãåå ã ããŒãã«ã®æ€çŽ¢ã¯é«éã§ãããåçžã¹ã¿ãã§äœæ¥ãããšãã»ã©ã§ã¯ãããŸããã ããã«ããã®ãããªããã·ã¥ããŒãã«ã®ãµã€ãºã¯å³å¯ã«å¶éãããŠãããåãå€ãããå Žåã¯ãæåããæ±çšåæ€çŽ¢ã³ãŒãã«ããŒã«ããã¯ããå¿
èŠããããŸãã ãã®æäœã¯éåžžã«ã³ã¹ããããããŸãã
ãã®ãããªåé¡ãçºçããå Žåã次ã®2ã€ã®æ¹æ³ã®ããããã§è§£æ±ºã§ããŸãã
- 1.å
±éã®ã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠãããã®ãªããžã§ã¯ããåŒã³åºããªãã§ãã ãã
- 2.å
±éã®åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ãéžæãã æœè±¡åºæ¬ã¯ã©ã¹ã«çœ®ãæããŸã
ãã®åé¡ã¯äžè¬çã§ã¯ãããŸãããã巚倧ãªåã®éå±€ãããããããããã¹ãŠå
±éã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããã®å
±éã®ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¡ãœãããåŒã³åºãå Žåã«çºçããå¯èœæ§ããããŸãã ããã»ããµã¯ãããã®ã¡ãœãããåŒã³åºãå Žæã§éåžžã«ç©æ¥µçã«åäœãããããã¡ãœããèªäœãå®è¡ããäœæ¥ã ãã§ã¯èª¬æã§ããªãããšã«æ°ä»ããããããŸããã
æŽå²å€§èŠæš¡ãªã·ã¹ãã ãèšèšãããšããæ°åã®ç°ãªãã¿ã€ããååšããå¯èœæ§ãããããããã¯ãã¹ãŠå
±éã®ã¿ã€ãã«ç±æ¥ããããšãäºåã«ããã£ãŠããŸããã ããã€ãã®å Žæã§ã¯ãåºæ¬åããã¢ã¯ã»ã¹ããå¿
èŠããããŸãã ç§ãã¡ã®ããŒã ã«ã¯ããã®èŠæš¡ã®åé¡ã解決ãããšãã«ã€ã³ã¿ãŒãã§ã€ã¹ããã£ã¹ãããããããšã«ç²ŸéããŠãã人ãããã®ã§ãã«ãŒãã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãªããåºæ¬ã¯ã©ã¹ã®æœè±¡ã䜿çšããããšã«ããŸããã
ã€ã³ã¿ãŒãã§ã€ã¹ã®ãã£ã¹ãããã«é¢ããåªããèšäºã¯ãVance Morrisonã®ããã°ã«ãããŸãã
梱å
ãé¿ããããã±ãŒãžã³ã°ãšã¯ãããŒãäžã®ãªããžã§ã¯ãã«ããªããã£ããæ§é ãªã©ã®éèŠãªã¿ã€ããã©ããããããã»ã¹ã§ãã ãã®ãã©ãŒã ã§ã¯ããã®åããªããžã§ã¯ãåç
§ãå¿
èŠãšããã¡ãœããã«æž¡ãããšãã§ããŸãã 解åã¯ãå
ã®å€ã®æœåºã§ãã
ããã±ãŒãžåã«ã¯ããªããžã§ã¯ãã®åé¢ãã³ããŒãããã³ãã£ã¹ãã«å¿
èŠãªããã»ããµãŒæéãããããŸãã ãã ããããã«éèŠãªã®ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŒãäžã§ã¢ã¯ãã£ãåãããããšã§ãã ããã±ãŒãžã³ã°ãäžæ³šæã«åŠçãããšãããã°ã©ã ã«å€ãã®å²ãåœãŠæäœãçºçããå¯èœæ§ããããããããã¹ãŠãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«è¿œå ã®è² æ
ããããŸãã
åæ§ã®æäœãå®è¡ããããã³ã«ãæ瀺çãªããã±ãŒãžåãè¡ãããŸãã
int x = 32; object o = x;
ããã®äžéèšèªã¯æ¬¡ã®ããã«ãªããŸãã
IL_0001: ldc.i4.s 32 IL_0003: stloc.0 IL_0004: ldloc.0 IL_0005: box [mscorlib]System.Int32 IL_000a: stloc.1
ã€ãŸããã³ãŒãå
ã®ã»ãšãã©ã®ããã±ãŒãžã³ã°ãœãŒã¹ãèŠã€ããã®ã¯æ¯èŒçç°¡åã§ããILDASMã䜿çšããŠãILå
šäœãããã¹ãã«å€æããŠæ€çŽ¢ããã ãã§ãã
äžèŠåãªããã±ãŒãžã³ã°ãå¯èœãªéåžžã«äžè¬çãªç¶æ³ã¯ã
ãªããžã§ã¯ããŸãã¯
ãªããžã§ã¯ã[]ããã©ã¡ãŒã¿ãŒãšããŠåãåãAPIã䜿çšããããšã§ãã æãç°¡åãªã®ã¯ããªããžã§ã¯ããžã®åç
§ã®ã¿ãæ ŒçŽãã
String.FormatãŸãã¯åŸæ¥ã®ã³ã¬ã¯ã·ã§ã³ã§ãããäœããã®çç±ã§å®å
šã«åé¿ãããäœæ¥ã§ãã
ããã«ã次ã®ããã«ãã€ã³ã¿ãŒãã§ã€ã¹ã«æ§é ãå²ãåœãŠããšãã«ããã±ãŒãžåãçºçããå ŽåããããŸãã
interface INameable { string Name { get; set; } } struct Foo : INameable { public string Name { get; set; } } void TestBoxing() { Foo foo = new Foo() { Name = "Bar" };
ãã®ã³ãŒãããã¹ãããå Žåãå®éã«ããã¯ãããå€æ°ã䜿çšããŠããªãå Žåãã³ã³ãã€ã©ã¯äœ¿çšãããŠããªããããæé©åã®é åºã§ããã¯åœä»€ãåé€ããã ãã§ããããšã«æ³šæããŠãã ããã ã¡ãœãããåŒã³åºãããä»ã®æ¹æ³ã§å€ã䜿çšãããšããã«ããããã³ã°åœä»€ãé
眮ãããŸãã
ããã±ãŒãžã³ã°äžã«çºçãããã1ã€ã®ããšã¯ã次ã®ã³ãŒãã®çµæã§ãã
int val = 13; object boxedVal = val; val = 14;
ãã®åŸã
boxedValã®å€ã¯ã©ããªããŸããïŒ
ããã±ãŒãžåãããšãå€ãã³ããŒãããå
ã®ã³ããŒãšã³ããŒã®éã«ã¯æ¥ç¶ããããŸããã ããšãã°ã
valã¯14ã«å€æŽãããå ŽåããããŸããã
boxedValã¯å
ã®å€13
ãä¿æããŸãã
ããã»ããµãããã¡ã€ã«ã§ããã±ãŒãžåã远跡ã§ããå ŽåããããŸãããå€ãã®ããã±ãŒãžååŒã³åºãã¯åã«çµã¿èŸŒã¿ã§ãããããããèŠã€ããä¿¡é Œã§ããæ¹æ³ã¯ãããŸããã é床ã®ããã±ãŒãžã³ã°ã§ã¯ãããã»ããµãããã¡ã€ã«ã«
newã䜿çšããã¡ã¢ãªã®å€§éå²ãåœãŠã®ã¿ã衚瀺ãããŸãã
æ§é ãç©æ¥µçã«ããã±ãŒãžåããå¿
èŠãããããããªãã§ã¯ã§ããªããšããçµè«ã«éããå Žåãããããæ§é ãã¯ã©ã¹ã«å€æããå¿
èŠããããŸãã
æåŸã«ãåç
§ã«ãã£ãŠéèŠãªåãæž¡ãããšã¯ããã±ãŒãžåã§ã¯ãªãããšã«æ³šæããŠãã ããã ILãèŠãŠãããã±ãŒãžã³ã°ãçºçããªãããšã確èªããŠãã ããã éèŠãªã¿ã€ãã®ã¢ãã¬ã¹ãã¡ãœããã«éä¿¡ãããŸãã
foreachãšforeachã®æ¯èŒMeasureItããã°ã©ã ã䜿çšããŠã
forã«ãŒããš
foreachã«ãŒãã§ã®ã³ã¬ã¯ã·ã§ã³ã®åæã®éããè©äŸ¡ããŸãã ã»ãšãã©ã®å Žåãæšæº
forã«ãŒãã®äœ¿çšã¯ã¯ããã«é«éã§ãã ãã ããç¬èªã®ç°¡åãªãã¹ããå®è¡ããããšãããšãã·ããªãªã«ãã£ãŠã¯ãäž¡æ¹ã®ãµã€ã¯ã«ã®ããã©ãŒãã³ã¹ãã»ãŒçããããšãããããŸãã å®éãå€ãã®ç¶æ³ã§ã.NETã¯åçŽãªforeachã¹ããŒãã¡ã³ããæšæºforã«ãŒãã«å€æããŸãã
次ã®ã³ãŒãã
å«ãForEachVsForãããžã§ã¯ããæ€èšããŠãã ããã
int[] arr = new int[100]; for (int i = 0; i < arr.Length; i++) { arr[i] = i; } int sum = 0; foreach (int val in arr) { sum += val; } sum = 0; IEnumerable<int> arrEnum = arr; foreach (int val in arrEnum) { sum += val; }
åéããåŸãILãªãã¬ã¯ã·ã§ã³ããŒã«ã䜿çšããŠãã®ã³ãŒããéã³ã³ãã€ã«ããŠã¿ãŠãã ããã æåã®
foreachãå®éã«
forã«ãŒããšããŠã³ã³ãã€ã«ãããããšãããããŸãã äžéèšèªã¯æ¬¡ã®ãšããã§ãã
ä¿åãããŒããè¿œå ã1ã€ã®ãã©ã³ããšããå€ãã®æäœããããŸã-ãã¹ãŠãéåžžã«ç°¡åã§ãã
ãã ããé
åãIEnumerableã«æã¡èŸŒãã§åãæäœãå®è¡ãããšãäœæ¥ã¯ã¯ããã«é«äŸ¡ã«ãªããŸãã
IL_0043: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator() IL_0048: stloc.s CS$5$0002 .try { IL_004a: br.s IL_005a
ä»®æ³ã¡ãœããã®4ã€ã®åŒã³åºããtry-finallyãããã¯ãããã³åæã¹ããŒã¿ã¹ãç£èŠãããããŒã«ã«åæåå€æ°ã®ã¡ã¢ãªå²ãåœãŠïŒããã§ã¯è¡šç€ºãããŠããŸããïŒããããŸãã ãã®ãããªæäœã¯ãéåžžã®forã«ãŒããããã¯ããã«é«äŸ¡ã§ããããå€ãã®ããã»ããµæéãšããå€ãã®ã¡ã¢ãªã䜿çšããŸãã
ããã§ã®åºæ¬çãªããŒã¿æ§é ã¯äŸç¶ãšããŠé
åã§ããã
forã«ãŒãã䜿çšã§ããããšãå¿ããªãã§ãã ããããã ããåã
IEnumerableã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ã¹ãããããšã§é£èªåãé²ããŸãã èšäºã®åé ã§æ¢ã«è¿°ã¹ãäºå®ãèæ
®ããããšã¯éèŠã§ãïŒæ·±ãããã©ãŒãã³ã¹ã®æé©åã¯ããã°ãã°ã³ãŒãã®æœè±¡åã«åããŸãã ãããã£ãŠã
foreachã¯ã«ãŒãã®æœè±¡åã§ããã
IEnumerableã¯ã³ã¬ã¯ã·ã§ã³ã®æœè±¡åã§ãã äžç·ã«ããããã¯é
åãå埩ãã
forã«ãŒãã䜿çšããŠåçŽãªæé©åã劚ããåäœãæäŸããŸãã
ãã£ã¹ã
ååãšããŠãå¯èœãªå Žåã¯åžžã«åŒ·å¶ãåé¿ããå¿
èŠããããŸãã 匷å¶ã¯ãã°ãã°è³ªã®æªãã¯ã©ã¹èšèšã瀺ããŸãããæã«ã¯ãããæ¬åœã«å¿
èŠã§ãã ãã®ãããããšãã°ãããŸããŸãªãµãŒãããŒãã£APIã䜿çšããå Žåãªã©ã笊å·ä»ãã®æ°å€ã笊å·ãªãã«å€æãããšãã¯ããã£ã¹ãã«é Œããªããã°ãªããŸããã ãªããžã§ã¯ãã®ãã£ã¹ãã¯ããã»ã©é »ç¹ã«ã¯è¡ãããŸããã
ãªããžã§ã¯ãã®ãã£ã¹ãã«ã³ã¹ãããããããšã¯ãããŸãããããã®ãããªæäœã®ã³ã¹ãã¯ããªããžã§ã¯ãéã®é¢ä¿ã«ãã£ãŠåçã«å€åããå¯èœæ§ããããŸãã ç¥å
ãç®çã®åå«ã«æã£ãŠããããšã¯ãéã®æäœãå®è¡ãããããã¯ããã«é«äŸ¡ã§ããããã®ãããªæäœã®ã³ã¹ãã¯ãéå±€ã倧ããã»ã©é«ããªããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãžã®ãã£ã¹ãã¯ãç¹å®ã®ã¿ã€ããžã®ãã£ã¹ããããè²»çšãããããŸãã
äžæ£ãªãã£ã¹ãã¯çµ¶å¯Ÿã«åãå
¥ããããŸããã ãã®å Žåã
InvalidCastExceptionäŸå€ãçºçããŸãããã®äŸå€ã®ã³ã¹ãã¯ããã£ã¹ãæäœã®ãäŸ¡æ Œããæ¡éãã«è¶
ããŸãã
ãã®æ¬ã®ãœãŒã¹ã³ãŒãã®
CastingPerfãããžã§ã¯ããåç
§ããŠãã ãããããŸããŸãªã¿ã€ãã®ãã£ã¹ãã®æ°ãèšèŒãããŠããŸãã
ã³ã³ãã¥ãŒã¿ãŒã§ã®ãã¹ãå®è¡äžã«ã次ã®çµæãåŸãããŸããã
JIT (ignore): 1.00x No cast: 1.00x Up cast (1 gen): 1.00x Up cast (2 gens): 1.00x Up cast (3 gens): 1.00x Down cast (1 gen): 1.25x Down cast (2 gens): 1.37x Down cast (3 gens): 1.37x Interface: 2.73x Invalid Cast: 14934.51x as (success): 1.01x as (failure): 2.60x is (success): 2.00x is (failure): 1.98x
ãisãæŒç®åã¯ãçµæããã¹ãããŠããŒã«å€ãè¿ããã£ã¹ãã§ãã
ãasãæŒç®åã¯æšæºã®ãã£ã¹ãã«äŒŒãŠããŸããããã£ã¹ããæ©èœããªãå Žåã¯nullãè¿ããŸãã äžèšã®çµæãããããããã«ããã®æäœã¯äŸå€ãã¹ããŒãããããã¯ããã«é«éã§ãã
2ã€ã®ãã£ã¹ããè¡ããããã¿ãŒã³ãé©çšããªãã§ãã ããã
if (a is Foo) { Foo f = (Foo)a; }
'as' , :
Foo f = a as Foo; if (f != null) { ... }
, .
: ,
MemoryStream.Length long . API, , (
MemoryStream.GetBuffer ), , int. ,
long . .