[英]C# class instance field default value assignment plus default constructor equals double assignment?
我是c#的新手並且讀取了在默認構造函數調用之前初始化了實例字段。 這是否意味着它們被雙重初始化?
class MyClass
{
public int value;
}
這是否意味着該值獲得默認值0然后調用默認構造函數並再次分配0?
不,除非指定變量初始值設定項,否則編譯器創建的無參數構造函數不會對字段執行賦值。 所以在這樣的類中:
class Test
{
int a = 0;
int b = 1;
int c;
}
...生成的構造函數在IL中看起來像這樣:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 22 (0x16)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.0
IL_0002: stfld int32 Test::a
IL_0007: ldarg.0
IL_0008: ldc.i4.1
IL_0009: stfld int32 Test::b
IL_000e: ldarg.0
IL_000f: call instance void [mscorlib]System.Object::.ctor()
IL_0014: nop
IL_0015: ret
} // end of method Test::.ctor
注意a
和b
的分配但不是c
。 通常,顯式指定值0
並將其保留為默認值之間的差異是不可觀察的,但它存在於IL中。 ( 在調用基類構造函數之前決定調用某個虛方法的子類可以證明存在差異,但我懷疑這會違反CLS。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.