当成员变量在 class 中初始化但不是在构造函数的帮助下时,后台发生了什么?
What is happening in the background when a member variable is initialized within a class but not with the help of the constructor?
谁能给我解释一下下面的 C# 示例代码?
public class MyTestClass
{
private int x = 100;
private int y;
public MyTestClass
{
y = 200;
}
}
我知道当 MyTestClass 被实例化时,构造函数被调用并且 y 被赋予值 200。但是在 x 的情况下会发生什么? 100 什么时候实际分配给 x?我是否应该想象这就像 x 在构造函数中并在那里获得初始值?
是的,在提供的代码中就像在构造函数中一样。查看由编译器生成的 IL 代码:
.class public auto ansi beforefieldinit MyTestClass
extends [System.Runtime]System.Object
{
// Fields
.field private int32 x
.field private int32 y
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2050
// Code size 28 (0x1c)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.s 100
IL_0003: stfld int32 MyTestClass::x
IL_0008: ldarg.0
IL_0009: call instance void [System.Runtime]System.Object::.ctor()
IL_000e: nop
IL_000f: nop
IL_0010: ldarg.0
IL_0011: ldc.i4 200
IL_0016: stfld int32 MyTestClass::y
IL_001b: ret
} // end of method MyTestClass::.ctor
} // end of class MyTestClass
在执行构造函数之前处理所有成员声明。这应该是显而易见的,否则,将不会存在要在构造函数中设置的字段。如果一个字段在它被声明的地方被初始化,那么这个赋值就会在成员被处理时发生。这意味着,在您的情况下, x
在执行构造函数代码时已经具有值 100 。您可以认为这样的初始化字段与 struct
字段几乎一样被填充,这是在没有显式构造函数的情况下发生的。
谁能给我解释一下下面的 C# 示例代码?
public class MyTestClass
{
private int x = 100;
private int y;
public MyTestClass
{
y = 200;
}
}
我知道当 MyTestClass 被实例化时,构造函数被调用并且 y 被赋予值 200。但是在 x 的情况下会发生什么? 100 什么时候实际分配给 x?我是否应该想象这就像 x 在构造函数中并在那里获得初始值?
是的,在提供的代码中就像在构造函数中一样。查看由编译器生成的 IL 代码:
.class public auto ansi beforefieldinit MyTestClass
extends [System.Runtime]System.Object
{
// Fields
.field private int32 x
.field private int32 y
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2050
// Code size 28 (0x1c)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.s 100
IL_0003: stfld int32 MyTestClass::x
IL_0008: ldarg.0
IL_0009: call instance void [System.Runtime]System.Object::.ctor()
IL_000e: nop
IL_000f: nop
IL_0010: ldarg.0
IL_0011: ldc.i4 200
IL_0016: stfld int32 MyTestClass::y
IL_001b: ret
} // end of method MyTestClass::.ctor
} // end of class MyTestClass
在执行构造函数之前处理所有成员声明。这应该是显而易见的,否则,将不会存在要在构造函数中设置的字段。如果一个字段在它被声明的地方被初始化,那么这个赋值就会在成员被处理时发生。这意味着,在您的情况下, x
在执行构造函数代码时已经具有值 100 。您可以认为这样的初始化字段与 struct
字段几乎一样被填充,这是在没有显式构造函数的情况下发生的。