C#.Net里面的.CCtor和Ctor是什么呢?
1.前言
RT:有人問Net里面的.CCtor和Ctor是什么?首先說答案,.CCtor是靜態構造函數,.Ctor是非靜態構造函數。通過例子分析下這兩個特殊的函數,本篇看下。
2.概述
先上例子:
public class ABC{
public ABC(){
}
int i=0x10;
}
public class BBC:ABC{
public BBC(){
}
int i = 0x20;
}
static void Main(string[] args)
{
BBC bBC = new BBC();
}
簡單點來說,類BBC的非靜態構造函數就是BBC.Ctor,也就是構造函數BBC(){}.同理ABC的非靜態構造函數ABC.Ctor也就是ABC(){}
作用為什么Roslyn編譯器要加上一個這種函數,就是為了循環往上初始化父類。直到Object.Ctor為止,也就是初始化到最基礎的Object類為止才不會初始化,一層層的向上執行。
以上面例子為例
運行的過程如下:
1.new BBC()
2.BBC.Ctor
3.ABC.Ctor
4.Object.Ctor
也就是說,有多少個父類,它統統初始化。方便以后調用,比如ABC類里面有個變量i,就是此時被初始化的,如果沒有被初始化,如果需要用到就會報錯。這里注意,如果BBC類里面有全局變量,則優先于ABC里面的全局變量i初始化。
代碼最后我們看下它的底層代碼BBC bBC = new BBC() Program+BBC..ctor
00007FF862D006D7 48 B9 50 21 DF 62 F8 7F 00 00 mov rcx,7FF862DF2150h
00007FF862D006E1 E8 7A 02 B0 5F call CORINFO_HELP_NEWSFAST (07FF8C2800960h)
00007FF862D006E6 48 89 45 20 mov qword ptr [rbp+20h],rax
00007FF862D006EA 48 8B 4D 20 mov rcx,qword ptr [rbp+20h]
00007FF862D006EE E8 05 E7 0D 00 call Test_.Program+BBC..ctor() (07FF862DDEDF8h)
int i=0x10 public ABC(){}
00007FF862D015C7 E8 44 64 C2 5F call 00007FF8C2927A10
00007FF862D015CC 48 8B 4D 40 mov rcx,qword ptr [rbp+40h]
00007FF862D015D0 C7 41 08 10 00 00 00 mov dword ptr [rcx+8],10h
00007FF862D015D7 48 8B 4D 40 mov rcx,qword ptr [rbp+40h]
00007FF862D015DB FF 15 4F FA F6 FF call qword ptr [CLRStub[MethodDescPrestub]@00007FF862C71030 (07FF862C71030h)]
00007FF862D015E1 90 nop
00007FF862D015E2 90 nop
00007FF862D015E3 FF 15 2F 63 12 00 call qword ptr [CLRStub[MethodDescPrestub]@00007FF862E27918 (07FF862E27918h)]
public BBC(){}
00007FF862D0157B E8 60 D8 0D 00 call Test_.Program+ABC..ctor() (07FF862DDEDE0h)
00007FF862D01580 90 nop
00007FF862D01581 90 nop