
ã¡ã¢ã®ç¬¬2éšã.NETã«æçš¿ãããšããæ¥ãŸããã
æ§æãã¡ã€ã«ã«ã¯åŸ©venãå¿
èŠã§ãã
* .CONFIG-ã¢ããªã±ãŒã·ã§ã³ãæ¬åœã«èšå®ã§ããŸããïŒ
ã¿ã€ãMark R. "Procmon.exe"ããæåãªãŠãŒãã£ãªãã£ãèµ·åãããã¹ããŠã£ã³ããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åããŠããã«éããã€ãã³ãã®åéãåæ¢ããŸãã åä¿¡ãããã°ã§ãã¢ããªã±ãŒã·ã§ã³ãååã§ãã£ã«ã¿ãªã³ã°ããŸãïŒIncludeïŒã 衚瀺ãããå
容ã¯æ¬¡ã®ãšããã§ãã
1) config: 22:09:36.0364337 WindowsFormsApplication1.exe 7388 QueryOpen S:\WindowsFormsApplication1.exe.config NAME NOT FOUND 2) INI: 22:09:36.0366595 WindowsFormsApplication1.exe 7388 QueryOpen S:\WindowsFormsApplication1.INI NAME NOT FOUND 3) Local: 22:09:36.0537481 WindowsFormsApplication1.exe 7388 QueryOpen S:\WindowsFormsApplication1.exe.Local NAME NOT FOUND
PowerGUIãEXEã«ã³ã³ãã€ã«ãããPowerShellã¹ã¯ãªããã®æ§æãã¡ã€ã«ã䜿çšããŠããããšãå¶ç¶çºèŠããŸããïŒãã¹ã¯ãŒãã§ä¿è·ããããããã«ãµãŒãã¹ãäœæããããšãã§ããŸãïŒã
ãã¡ã€ã«èªäœïŒUntitled.exeããã³Untitled.exe.configã
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> <supportedRuntime version="v2.0.50727" /> </startup> <runtime> <loadFromRemoteSources enabled="true"/> </runtime> </configuration>
.INI-ã¢ã»ã³ããªãæé©åããå¿
èŠããªãããšãJITã³ã³ãã€ã©ã«äŒããããšãã§ããŸãã ãããã£ãŠããªãªãŒã¹ã§ã¯ãMSILãæé©åã§ãã2ã€ã®ç°ãªããã«ãã䜿çšããã«ããã®ãã¡ã€ã«ãä»ããŠJITã管çã§ããŸãã
[.NET Framework Debugging Control] GenerateTrackinglnfo = 1 AllowOptimize = 0
.Local-
ãã€ãããã¯ãªã³ã¯ã©ã€ãã©ãªã®ãªãã€ã¬ã¯ã ãžã§ã³ã»ããã³ã¹ã®ãžã§ãŒã¯ããã»ã¹ãèŠããå¥ã®å ŽæããããŸãã
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \çŸåšã®ããŒãžã§ã³\ã€ã¡ãŒãžãã¡ã€ã«å®è¡ãªãã·ã§ã³\
ã¬ãžã¹ããªããŒMyApp.EXEãäœæãããã®äžã«æ°ããæååå€DebuggerãäœæããŸããããã§ããããã¬ãžã®ãã«ãã¹ïŒããå ŽåïŒã瀺ããcalc.exeãèšè¿°ããŸãã
ããã§ãMyApp.EXEãèµ·åããããšãããšãèšç®æ©ãå®éã«èµ·åããŸãã
1ïŒå°ãã®CïŒå±¥æŽ
ç°ãªãããŒãžã§ã³ã§è¿œå ããããã®CïŒ2.0
ãžã§ããªãã¯ãnull蚱容åãå¿åã¡ãœãããããªã²ãŒãã®åŒ·åãå埩çãªyieldãããã¯ã éšååãéçã¯ã©ã¹ãç°ãªãã¢ã¯ã»ã¹ä¿®é£Ÿåãæã€ããããã£ãåå空éãšã€ãªã¢ã¹ïŒããŒã«ã«ã§WinForms = System.Windows.Formsã䜿çšãã°ããŒãã«ã«-FirstAlias :: Demoããã³SecondAlias :: DemoïŒããã©ã°ããã£ã¬ã¯ãã£ããå®å
šã§ãªãã³ãŒãã®åºå®ãµã€ãºãããã¡ãŒïŒåºå®ãã€ãããŒã¿[20]ïŒã
CïŒ3.0
LINQãèªåããããã£ãé
åãšããŒã«ã«å€æ°ã®æé»çãªåæå®ã宣èšã®å Žæã§ã®ãªããžã§ã¯ããšã³ã¬ã¯ã·ã§ã³ã®åæååãå¿ååã åŒã©ã ããšåŒããªãŒãæ¡åŒµã¡ãœãããéšåã¡ãœããã
CïŒ4.0
ååä»ãåŒæ°ããªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãäžè¬åãããããªãšãŒã·ã§ã³ãåçåã
CïŒ5.0
éåæ/åŸ
æ©ãforeachã«ãŒãã®å€æŽãåŒã³åºãå
ã³ã³ããŒãã³ãã«é¢ããæ
å ±ã®å±æ§ã
2ïŒã¡ã¢ãªå
ã®åç
§åã®ã€ã³ã¹ã¿ã³ã¹ã®æå°ãµã€ãºã
x86ããã³x64ã®å Žå空ã®ã¯ã©ã¹ãäœæããŸãã
class MyClass { }
32ãããã§ã³ã³ãã€ã«ããWindbgã®ãµã€ãºã調ã¹ãŸãã
0:005> !do 023849bc Name: ConsoleApplication1.MyClass MethodTable: 006c39d4 EEClass: 006c1904 Size: 12(0xc) bytes - . File: E:\...\ConsoleApplication1.exe Fields: None
64ãããã§ã³ã³ãã€ã«ããŸãã
0:003> !do 0000007c8d8465b8 Name: ConsoleApplication1.MyClass MethodTable: 00007ffa2b5c4320 EEClass: 00007ffa2b6d2548 Size: 24(0x18) bytes File: E:\...\ConsoleApplication1.exe Fields: None
æåã®4ãã€ããŸãã¯8ãã€ãã¯ãªããžã§ã¯ãã®ã¿ã€ãã«ã¯ãŒãã§ãããããå°ãããªããŸããã åæãã¬ããŒãžã³ã¬ã¯ã¿ã®ãªãŒããŒãããã®ä¿åããã¡ã€ãã©ã€ãºãããã·ã¥ã³ãŒãã®ä¿åã«äœ¿çšãããŸãã ãã®ãã£ãŒã«ãã®äžéšã®ãããã¯ãåç¹å®ã®ç¬éã«ã©ã®æ
å ±ãæ ŒçŽããããã決å®ããŸãã
2çªç®ã®4ãã€ããŸãã¯8ãã€ãã¯ãã¡ãœããããŒãã«ãžã®ãªã³ã¯ã§ãã
ããŒã¿ãšã¢ã©ã€ã¡ã³ãçšã®3çªç®ã®4ãã€ããŸãã¯8ãã€ãïŒããšããããã«äœããªãå Žåã§ãïŒã
x86ã®åç
§åã®ã€ã³ã¹ã¿ã³ã¹ã®åèšæå°ãµã€ãºã¯12ãã€ãã§ãx64ã¯24ãã€ãã§ãã
3ïŒã¡ã¢ãªãŒå
ã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ééçãã£ãŒã«ãããã³ã¡ãœããïŒx64ïŒã
1ã€ã®ãã£ãŒã«ããšèªåããããã£ãè¿œå ããŸã class MyClass { private string _field1 = "Some string 1"; public string Field2 { get; set; } }
IL 2ã€ã®ãã£ãŒã«ãããããŸãã
.field private string '<Field2>k__BackingField' .field private string _field1
ãããŠ2ã€ã®æ¹æ³ïŒ
.method public hidebysig specialname instance string get_Field2() cil managed .method public hidebysig specialname instance void set_Field2(string 'value') cil managed
誰ãã©ãã«çãããèŠãŠã¿ãŸãããïŒ
0:003> !do 0000005400006600 Name: ConsoleApplication1.MyClass MethodTable: 00007ffa2b5c4378 EEClass: 00007ffa2b6d2548 Size: 32(0x20) bytes File: E:\...\ConsoleApplication1.exe Fields: MT Field Offset Type VT Attr Value Name 00007ffa89d60e08 4000002 8 System.String 0 instance 0000005400006620 _field1 00007ffa89d60e08 4000003 10 System.String 0 instance 00000054000035a0 <Field2>k__BackingField
ãã£ãŒã«ãã¯ã€ã³ã¹ã¿ã³ã¹ã«çŽæ¥å°éãããã®æå°ãµã€ãºã«åœ±é¿ããŸããïŒæåã®ãªã³ã¯ã¯17ãã24ãããïŒä»¥åã¯ç©ºã§ããïŒã§32ã§ã2çªç®ã®25-32ïŒã·ãŒã±ã³ã¹ã®é åºãä¿æããããã«å±æ§ã§ãïŒãããããã¡ãœããã¯çŽæ¥ã€ã³ã¹ã¿ã³ã¹ã¯ãªããããããžã®ãªã³ã¯ã®ã¿ãååšããããããµã€ãºã«åœ±é¿ããŸããã§ããã
ã¡ãœããã®è¡šãèŠãŠã¿ãŸãããïŒ
0:003> !dumpmt -md 00007ffa2b5c4378 EEClass: 00007ffa2b6d2548 Module: 00007ffa2b5c2fc8 Name: ConsoleApplication1.MyClass mdToken: 0000000002000003 File: E:\...\ConsoleApplication1.exe BaseSize: 0x20 ComponentSize: 0x0 Slots in VTable: 7 Number of IFaces in IFaceMap: 0 -------------------------------------- MethodDesc Table Entry MethodDesc JIT Name 00007ffa89ae6300 00007ffa896980e8 PreJIT System.Object.ToString() 00007ffa89b2e760 00007ffa896980f0 PreJIT System.Object.Equals(System.Object) 00007ffa89b31ad0 00007ffa89698118 PreJIT System.Object.GetHashCode() 00007ffa89b2eb50 00007ffa89698130 PreJIT System.Object.Finalize() 00007ffa2b6e0390 00007ffa2b5c4358 JIT ConsoleApplication1.MyClass..ctor() 00007ffa2b5cc130 00007ffa2b5c4338 NONE ConsoleApplication1.MyClass.get_Field2() 00007ffa2b5cc138 00007ffa2b5c4348 NONE ConsoleApplication1.MyClass.set_Field2(System.String)
ãããŠãããã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãšã.NETã®ã€ã³ã¹ããŒã«æã«Ngenèªèº«ãSystem.Objectããç¶æ¿ããã€ã³ã¹ã¿ã³ã¹ã¡ãœãããé€ããŠãã©ã¡ãããŸã JITã³ã³ãã€ã«ã«åæ ŒããŠããŸããã
ãã®æ®µèœã®çµããã«ããã£ãŒã«ãã§ç€ºããããªããžã§ã¯ãã®ãµã€ãºãšãšãã«ã€ã³ã¹ã¿ã³ã¹ã®ãã«ãµã€ãºãèŠãŠãããŸãã
MyClass mcClass = new MyClass(); mcClass.Field2 = "Some string 2"; 0:003> !objsize 0000005400006600 sizeof(0000005400006600) = 144 (0x90) bytes (ConsoleApplication1.MyClass)
ãã£ãŒã«ãã®ãµã€ãºãèŠãŠãããã確èªããŸãããã
0:003> !objsize 0000005400006620 sizeof(0000005400006620) = 56 (0x38) bytes (System.String) 0:003> !objsize 00000054000035a0 sizeof(00000054000035a0) = 56 (0x38) bytes (System.String)
åèšïŒ56 + 56 + 32 = 144ã
4ïŒéçãã£ãŒã«ããšã¡ãœããïŒx64ïŒã
ã¿ã€ã class MyClass { private string _name = "Some string"; public static string _STR = "I'm STATIC"; public static void ImStaticMethod() { } } MyClass mcClass = new MyClass(); Console.WriteLine(MyClass._STR);
æå°ã€ã³ã¹ã¿ã³ã¹ãµã€ãºïŒéçãã£ãŒã«ãã¯èæ
®ãããŸããïŒïŒ
0:003> !do 00000033ba2c65f8 Name: ConsoleApplication1.MyClass MethodTable: 00007ffa2b5b4370 EEClass: 00007ffa2b6c2550 Size: 24(0x18) bytes File: E:\...\ConsoleApplication1.exe Fields: MT Field Offset Type VT Attr Value Name 00007ffa89d60e08 4000002 8 System.String 0 instance 00000033ba2c6610 _name 00007ffa89d60e08 4000003 10 System.String 0 static 00000033ba2c35a0 _STR
æ¹åŒãªã¹ãïŒ
0:003> !dumpmt -md 00007ffa2b5b4370 EEClass: 00007ffa2b6c2550 Module: 00007ffa2b5b2fc8 Name: ConsoleApplication1.MyClass mdToken: 0000000002000003 File: E:\...\ConsoleApplication1.exe BaseSize: 0x18 ComponentSize: 0x0 Slots in VTable: 7 Number of IFaces in IFaceMap: 0 -------------------------------------- MethodDesc Table Entry MethodDesc JIT Name 00007ffa89ae6300 00007ffa896980e8 PreJIT System.Object.ToString() 00007ffa89b2e760 00007ffa896980f0 PreJIT System.Object.Equals(System.Object) 00007ffa89b31ad0 00007ffa89698118 PreJIT System.Object.GetHashCode() 00007ffa89b2eb50 00007ffa89698130 PreJIT System.Object.Finalize() 00007ffa2b6d0110 00007ffa2b5b4350 JIT ConsoleApplication1.MyClass..cctor() 00007ffa2b6d03f0 00007ffa2b5b4348 JIT ConsoleApplication1.MyClass..ctor() 00007ffa2b5bc130 00007ffa2b5b4338 NONE ConsoleApplication1.MyClass.ImStaticMethod()
ConsoleApplication1.MyClass..cctorïŒïŒ-éçãã£ãŒã«ãã«ç®ãåãããããéçã³ã³ã¹ãã©ã¯ã¿ãŒãå®è¡ãããŸããã åã³ã³ã¹ãã©ã¯ã¿ãšãåŒã°ããæ£ç¢ºã«åŒã³åºããããšãã¯äžæã§ãã éçãã£ãŒã«ãã®ååšäžã§èªåçã«äœæãããŸãã ãã®äžã§ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããªãå Žåã¯ãæ瀺çã«åŠæ¹ããªãæ¹ãè¯ãã§ãããã ããã«ãããã¡ã¿ããŒã¿ã®beforefieldinitãã©ã°ã䜿çšããŠæé©åãè¡ãããŸãã 詳现
msdn.microsoft.com/ru-ru/library/dd335949.aspxãµã€ãºã確èªããŠãã ããïŒ
0:003> !objsize 00000033ba2c65f8 sizeof(00000033ba2c65f8) = 72 (0x48) bytes (ConsoleApplication1.MyClass) 0:003> !objsize 00000033ba2c6610 sizeof(00000033ba2c6610) = 48 (0x30) bytes (System.String)
åèšïŒ24 + 48 = 72ã
ã¡ãœããã®ãããªéçãã£ãŒã«ãã¯ãåã€ã³ã¹ã¿ã³ã¹ã®ã³ããŒã«ä¿åãããŸããã
5ïŒèŠªãšãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã€ã³ã¹ã¿ã³ã¹ãä¿æãã人ãèŠã€ããŸãã
ããŒãçš3ãã€ã³ãããã®ããŒã¿ãšã¢ãã¬ã¹ã
0:003> !dumpclass 00007ffa2b6c2550 Class Name: ConsoleApplication1.MyClass mdToken: 0000000002000003 File: E:\...\ConsoleApplication1.exe Parent Class: 00007ffa89684908 Module: 00007ffa2b5b2fc8 Method Table: 00007ffa2b5b4370 Vtable Slots: 4 Total Method Slots: 6 Class Attributes: 100000 Transparency: Critical NumInstanceFields: 1 NumStaticFields: 1 MT Field Offset Type VT Attr Value Name 00007ffa89d60e08 4000002 8 System.String 0 instance _name 00007ffa89d60e08 4000003 10 System.String 0 static 00000033ba2c35a0 _STR
ç§ãã¡ã¯èŠªã«è¡ããŸãïŒ
0:003> !dumpclass 00007ffa89684908 Class Name: System.Object mdToken: 0000000002000002 File: C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Parent Class: 0000000000000000 - . Module: 00007ffa89681000 Method Table: 00007ffa89d613e8 Vtable Slots: 4 Total Method Slots: a Class Attributes: 102001 Transparency: Transparent NumInstanceFields: 0 NumStaticFields: 0
mcClass = new MyClassïŒïŒãä¿æããŠãã人ïŒ
0:003> !gcroot 00000033ba2c65f8 Thread 3310: 00000033b81fedb0 00007ffa2b6d031f ConsoleApplication1.Program.Main rbx: -> 00000033ba2c65f8 ConsoleApplication1.MyClass
çå®ã®ããã«èãããŸãã
6ïŒForeachã¯èª°ã§ããã
ã¿ã€ã1. foreachã䜿çšãããšãé衚瀺ã®ããŒã«ã«å€æ°ïŒã«ãŒãã€ãã¬ãŒã¿ãŒïŒãäœæãããŸãã
2. IDeachposableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããŠããå Žåãforeachã¹ããŒãã¡ã³ãã¯ã«ãŒãã®æåŸã§DisposeïŒïŒãèªåçã«åŒã³åºããŸãã
3. GetEnumeratorïŒïŒãMoveNextïŒïŒã¡ãœããã®åŒã³åºããããã³Currentããããã£ã®åŒã³åºãã«ã³ã³ãã€ã«ãããŸãã
4. Foreachã¯ãyield returnãšåæ§ã«ãé
延å埩ã§ããããšãã°ãmogogigabyteãã¡ã€ã«ãäžåºŠã«1è¡ãã€èªã¿åããã¡ã¢ãªãç¯çŽããå Žåã«éåžžã«äŸ¿å©ã§ãã
5.é
åã®Foreachã¯ãLengthããããã£ãšé
åã€ã³ãã¯ãµãŒã䜿çšããã€ãã¬ãŒã¿ãŒãªããžã§ã¯ããäœæããŸããã
6. CïŒ5ã§ã¯ãforeachã«ãŒãå
ã§ãã£ããã£ãããå€æ°ãæ£ããæ©èœããããã«ãªããŸããããCïŒ3ããã³CïŒ4ã¯å€æ°ã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ïŒæåŸïŒã®ã¿ããã£ããã£ããŸãã
7ïŒLINQ
ã¯ã©ãã1. LINQ to Objectã¯ãéåžžã®ããªã²ãŒãïŒã€ã³ããã»ã¹ã¯ãšãªïŒãšããŠJITã§å®è¡ãããLINQ to SQLã¯åŒããªãŒãæ§ç¯ããSQLãŸãã¯ä»ã®ç°å¢ã§æ¢ã«å®è¡ããŠããŸãã ããªãŒã¯ããªã²ãŒãã«å€æã§ããŸãã
2. LINQ to Objectsã®OrderByã§ã¯ããã¹ãŠã®ããŒã¿ãããŒãããå¿
èŠããããŸãã
3. LINQ to Objectsã§JoinïŒïŒã䜿çšãããšãå³åŽã®ã·ãŒã±ã³ã¹ããããã¡ãªã³ã°ãããŸãããå·ŠåŽã§ã¯ã¹ããªãŒã ãç·šæãããŸãããããã£ãŠã倧ããªã·ãŒã±ã³ã¹ãå°ããªã·ãŒã±ã³ã¹ã«æ¥ç¶ããå¿
èŠãããå Žåãå°ããªã·ãŒã±ã³ã¹ãæ£ããã·ãŒã±ã³ã¹ãšããŠæå®ãããšäŸ¿å©ã§ãã
4. EnumType.SelectïŒx => xïŒ-ããã¯çž®éã¯ãšãªåŒãšåŒã°ããçµæã¯èŠçŽ ã®ã·ãŒã±ã³ã¹ã§ããããœãŒã¹èªäœã§ã¯ãããŸãããããã¯ããŒã¿ã®æŽåæ§ã®èŠ³ç¹ããéèŠã§ãã ïŒé©åã«èšèšãããLINQããŒã¿ãããã€ããŒã«æå¹ã§ããïŒ
8ïŒã³ã¬ã¯ã·ã§ã³ã
ã¯ãªãã¯ããŠãªã¹ãT-é
åãå
éšçã«ä¿åããŸãã æ°ããèŠçŽ ãè¿œå ããã«ã¯ãé
åã«å€ãèšå®ããããæ¢åã®é
åã2åã®å€§ããïŒææžåãããŠããªãïŒã®æ°ããé
åã«ã³ããŒããŠããå€ãèšå®ããŸãã ãªã¹ãTããã¢ã€ãã ãåé€ããã«ã¯ããã®åŸãã®ã¢ã€ãã ãå
ã®äœçœ®ã«ã³ããŒããå¿
èŠããããŸãã RemoveAtïŒïŒã€ã³ããã¯ã¹ã«ãããåé€ã¯RemoveïŒïŒå€ãããã¯ããã«é«éã§ãïŒåèŠçŽ ã¯ã©ãã«ã§ãæ¯èŒãããŸãïŒã
é
åã®ãµã€ãºã¯åžžã«åºå®ãããŠããŸãããèŠçŽ ã«é¢ããŠã¯å¯å€ã§ãã
LinkedList Tã¯ãæ°ããã¢ã€ãã ããã°ããåé€ãæ¿å
¥ã§ãããªã³ã¯ãªã¹ãã§ããã€ã³ããã¯ã¹ã¯ãããŸããããå¹çã¯ç¶æãããŸãã
ReadOnlyDictionaryã¯ãæ瀺çãªã€ã³ã¿ãŒãã§ã€ã¹å®è£
ã®èåŸã«ãããã¹ãŠã®å¯å€æäœãé ãåãªãã©ãããŒã§ãã åºç€ã«è»¢éãããã³ã¬ã¯ã·ã§ã³ãéããŠèŠçŽ ãå€æŽããããšãå¯èœã§ãã
9ïŒãªãã·ã§ã³ã®ã¡ãœãããã©ã¡ãŒã¿ã
ãã¿ãã¬ïŒ void Method1( int x ) { x = 5; } IL: .method private hidebysig instance void Method1(int32 x) cil managed {
int xã¯å®æ°ã§ãã ãŸããå®æ°ã¯ã¡ã¿ããŒã¿ã«çŽæ¥æ ŒçŽãããŸããã€ãŸããå®æ°ãå€æŽããã«ã¯ããã®ã¡ãœããã䜿çšããŠãã¹ãŠã®ã³ãŒããåã³ã³ãã€ã«ããå¿
èŠããããŸãã ïŒ2ã€ã®ãœãŒã¹ã413ããŒãžïŒã
CïŒ4以éãååä»ãåŒæ°ã䜿çšãããŠããå Žåãã¡ãœãããã©ã¡ãŒã¿ãŒã®ååãå€æŽãããšä»ã®ã³ãŒãã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
10ïŒ.NETãã©ãããã©ãŒã äžã®ã¢ããªã±ãŒã·ã§ã³ã®æé©å
11ïŒåæã
ã¿ã€ã¯ lock ( obj ) { }
ãªã³ããã³ãã§ã®ã¿å®è¡ãããæéãããããŸãã CLRã¯ãã°ããŒãã«é
åãåæãããã¯ããŒãã«ãã«æ§é ãåæãããã¯ããäœæãã匱ããªã³ã¯ïŒãªãµã€ã¯ã«çšïŒã«ããããã¯ãææãããªããžã§ã¯ããžã®ãªã³ã¯ãšãWin32ã€ãã³ãã«å®è£
ãããã¢ãã¿ãŒãžã®ãªã³ã¯ãæã£ãŠããŸãã åæãããã¯ã®æ°å€ã€ã³ããã¯ã¹ã¯ããªããžã§ã¯ãã®ããããŒã¯ãŒãã«æ ŒçŽãããŸãã åæãªããžã§ã¯ããç Žæ£ãããå ŽåãåæãŠããããšã®æ¥ç¶ã¯å¥ã®ãªããžã§ã¯ãã§åå©çšããããã«äžæžããããŸãã
ãããããã¹ãŠãããã»ã©åçŽãªããã§ã¯ãªãããŸã èãããã¯ããããŸãã åæãããã¯ããŸã äœæãããŠããããäžæ¹ã®ã¹ã¬ããã®ã¿ããªããžã§ã¯ããææããŠããå Žåãããäžæ¹ã¯å®è¡ããããšããŠããªããžã§ã¯ãããããŒã¯ãŒãããææè
æ
å ±ãæ¶ãããŸã§ãã°ããåŸ
æ©ããŸãããããçºçããªãå Žåãã·ã³ããã¯ã¯éåžžã«å€æãããŸãã
12ïŒãããã³ã°ã
nããã±ãŒãžæ§é ã¯æ¬¡ã®ãšããã§ãã
public struct Point { public int X; public int Y; } List<Point> polygon = new List<Point>(); for ( int i = 0; i < 10000000; i++ ) { polygon.Add( new Point() { X = rnd.Next(), Y = rnd.Next() } ); } Point point = new Point { X = 5, Y = 7 }; bool contains = polygon.Contains( point );
1å·æ©ãçºå£²ããŸãã
次ã«ãã¡ãœãããè¿œå ããŸãã
public override int GetHashCode() { return (X & Y) ^ X;
2çªãéå§ããŸãã
次ã«ãã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£
ãè¿œå ããŸãïŒãã§ã«é©åãªã¡ãœããããããŸãïŒïŒ
public struct Point : IEquatable<Point> { ... }
3å·æ©ãçºå£²ããŸãã
ïŒãªã¹ãTã«ã¯IEquatable Tã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã¯ãããŸããïŒ
å¿åã¿ã€ããè©ŠããŸãã
var someType = new { Prop1 = 2, Prop2 = 80000 }; var items = Enumerable.Range( 0, 10000000 ) .Select( i => new { Prop1 = i, Prop2 = i+i } ) .ToList(); items.Contains(someType);
4å·æ©ãçºå£²ããŸãã
ã³ã³ãã€ã©ãŒã¯ãsomeTypeã®åãæ¡åŒµã¡ãœããã®åãšåäžã§ãããããåé¡ããªãã£ãããšãçºèŠããŸããã
ãŸãšããã¹ãçµæïŒ

ãããŠãILã®å¿ååã¯æ¬¡ã®ããã«ãªããŸãã

èå³ãããã°ãã¡ã¢ãªå
ã§someTypeã¯ã©ã®ããã«èŠãã var someType = new { Prop1 = 2, Prop2 = 80000 }; 0:005> !do 0000008da2745e08 Name: <>f__AnonymousType0`2[[System.Int32, mscorlib],[System.Int32, mscorlib]] MethodTable: 00007ffa2b5b4238 EEClass: 00007ffa2b6c2548 Size: 24(0x18) bytes File: E:\...\BoxingUnboxingPointList.exe Fields: MT Field Offset Type VT Attr Value Name 0...0 4000003 8 System.Int32 1 instance 2 <Prop1>i__Field 0...0 4000004 c System.Int32 1 instance 80000 <Prop2>i__Field
å€ã¿ã€ãã«ã¯ãå€èªäœïŒ2ããã³80,000ïŒãæ ŒçŽãããŸãã
ã¡ãœããè¡šïŒ
0:005> !dumpmt -md 00007ffa2b5b4238 EEClass: 00007ffa2b6c2548 Module: 00007ffa2b5b2fc8 Name: <>f__AnonymousType0`2[[System.Int32, mscorlib],[System.Int32, mscorlib]] mdToken: 0000000002000004 File: E:\...\BoxingUnboxingPointList.exe BaseSize: 0x18 ComponentSize: 0x0 Slots in VTable: 7 Number of IFaces in IFaceMap: 0 -------------------------------------- MethodDesc Table Entry MethodDesc JIT Name 0...8 0...0 NONE <>f__AnonymousType0`2[[...]].ToString() 0...0 0...8 NONE <>f__AnonymousType0`2[[...]].Equals(System.Object) 0...8 0...0 NONE <>f__AnonymousType0`2[[...]].GetHashCode() 0...0 0...0 PreJIT System.Object.Finalize() 0...0 0...8 NONE <>f__AnonymousType0`2[[...]]..ctor(Int32, Int32) 0...8 0...0 NONE <>f__AnonymousType0`2[[...]].get_Prop1() 0...0 0...8 NONE <>f__AnonymousType0`2[[...]].get_Prop2()
ç§ã¯ãŸãäœãä»ã®ãã®ãèŠãããšãæåŸ
ããŠããŸãã:)
13ïŒéåæ/åŸ
æ©
14ïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³
ã¿ã€ã¯ã0ãäžä»£ã®åºå®ãªããžã§ã¯ãã䜿çšããå ŽåãCLRã¯ãã®äžä»£ãå€ããšå®£èšããèªåã§æ°ããäžä»£ãéžæã§ããŸãã
äžä»£ã1ãã¯ã0ãããã®ã¿ã¢ã¯ã»ã¹ã§ãããã¡ã€ãã©ã€ãºããããªããžã§ã¯ãã¯ééããªãããã«ãããŸãã
ã2ãäžä»£ã®ãµã€ãºã¯äººçºçã«å¶éãããŠãããã䜿çšå¯èœãªãã¹ãŠã®ã¡ã¢ãªã䜿çšãããŸãïŒWindowsã¯CLRãšå
±æã§ããŸãïŒããGCã¯ããããã£ã±ãã«ãªãã®ãåŸ
ããããããå€ã䜿çšããŸãïŒããã¯ããããŸããïŒã
ããŒãã³ã°ãã§ãŒãºã§ã¯ãã©ã€ããšããŠããŒã¯ããããªããžã§ã¯ãã¯ãªã³ã¯ã倱ãã1ã€ã®ã¢ã»ã³ããªãçãæ®ãããšãã§ããŸãã
ã©ãŒãžãªããžã§ã¯ãããŒãã«ã¯85 kbãè¶
ãããªããžã§ã¯ããå«ãŸããŠããŸãããããã¯ã°ã©ãïŒå«ãŸããŠãããªããžã§ã¯ãïŒã§ã¯ãªã1ã€ã®ãªããžã§ã¯ããåç
§ããŠããŸãã äžä»£ã2ãã«é¢é£ä»ããããŠãäžç·ã«ãªããŸãã
ãœãŒã¹ïŒ
1ïŒJohn RobbinsãMicrosoft .NETããã³Microsoft Windowsçšã®ã¢ããªã±ãŒã·ã§ã³ã®ãããã°ãã
2ïŒãžã§ã³ã»ã¹ããŒããCïŒforProfessionalsãTheSubtleties of Programmingãã第3çã
3ïŒSasha GoldsteinãDima ZurbalevãIdo Flatovã.Netãã©ãããã©ãŒã ã§ã®ã¢ããªã±ãŒã·ã§ã³æé©åãã
å€ãã®æçŽãå€æããŸããããJITã³ã³ãã€ã©ãŒã¯åŸã§äœ¿çšã§ããŸãã
ãæž
èŽããããšãããããŸããã