有小伙伴被面试官问到这个问题,本篇彻底解析下这个问题。
为了彻底点,注意本篇是最底层的.Net 7 RC CLR
运行模型(汇编)为基础进行全局剖析,局部业务分析。
如有疏漏,请斧正。QQ:676817308.公众号:江湖评谈
这两个函数比较特殊的存在,.Ctor
是非静态默认实例化。.CCtor
是静态默认实例化。这两个函数伴随着.Net
任何对象的实例化都自动存在于这个对象当中。
跟踪.CCtor
可以在全局静态对象下断点,观察它的里面运行。
跟踪.Ctor
可以通过!name2ee
模块 模块.类名..Ctor
找到JITTED Code Address
,观察它的运行。正如本段题所说,这只是手段,不是目的。所以下面看目的。
先来看下非静态默认构造函数.Ctor
。上一段代码:
- internal class Program
- {
- public class ABC
- {
- }
- static void Main(string[] args)
- {
- ABC abc = new ABC();
- Console.ReadLine();
- }
- }
直接给它反编译:
- 00007FFDF2FA03B0 55 push rbp
- 00007FFDF2FA03B1 48 83 EC 40 sub rsp,40h
- 00007FFDF2FA03B5 48 8D 6C 24 40 lea rbp,[rsp+40h]
- 00007FFDF2FA03BA C5 D8 57 E4 vxorps xmm4,xmm4,xmm4
- 00007FFDF2FA03BE C5 FA 7F 65 E8 vmovdqu xmmword ptr [rbp-18h],xmm4
- 00007FFDF2FA03C3 33 C0 xor eax,eax
- 00007FFDF2FA03C5 48 89 45 F8 mov qword ptr [rbp-8],rax
- 00007FFDF2FA03C9 48 89 4D 10 mov qword ptr [rbp+10h],rcx
- 00007FFDF2FA03CD 83 3D BC E9 19 00 00 cmp dword ptr [7FFDF313ED90h],0
- 00007FFDF2FA03D4 74 05 je 00007FFDF2FA03DB
- 00007FFDF2FA03D6 E8 B5 BF 79 5E call JIT_DbgIsJustMyCode (07FFE5173C390h)
- 00007FFDF2FA03DB 90 nop
- 00007FFDF2FA03DC 48 B9 30 F6 5B F3 FD 7F 00 00 mov rcx,7FFDF35BF630h
- 00007FFDF2FA03E6 E8 75 7C C1 5E call JIT_TrialAllocSFastMP_InlineGetThread (07FFE51BB8060h)
- 00007FFDF2FA03EB 48 89 45 F0 mov qword ptr [rbp-10h],rax
- 00007FFDF2FA03EF 48 8B 4D F0 mov rcx,qword ptr [rbp-10h]
-
- // 这个地方是调用了.Ctor
- 00007FFDF2FA03F3 FF 15 0F 8D 60 00 call qword ptr [7FFDF35A9108h]
-
- 00007FFDF2FA03F9 48 8B 45 F0 mov rax,qword ptr [rbp-10h]
- 00007FFDF2FA03FD 48 89 45 F8 mov qword ptr [rbp-8],rax
- 00007FFDF2FA0401 FF 15 A9 93 60 00 call qword ptr [7FFDF35A97B0h]
- 00007FFDF2FA0407 48 89 45 E8 mov qword ptr [rbp-18h],rax