当成员变量在 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 字段几乎一样被填充,这是在没有显式构造函数的情况下发生的。