c#中类型或成员的声明顺序

Declaration order of types or members in c#

我对一些关于 C# 中类型或成员的声明顺序的活跃讨论感到非常困惑。

有一个热门问题,这个问题的输出是什么,为什么?

场景一:

    class Program
    {

        static readonly int A = Method();
        static readonly int B = 42;
        static int Method() => B;

        static void Main()
        {
            Console.WriteLine(A); // 0
        }
    }

如果假设,我更新上面的代码并将其变成这样:

场景二:

    class Program
    {

        
        static readonly int B = 42;
        static int Method() => B;
        static readonly int A = Method();
        static void Main()
        {
            Console.WriteLine(A); // 42
        }
    }

Scenario 1 的输出是 0Scenario 2 的输出是 42。这个输出是零还是 42?

我检查了几个答案,但无法理解这些答案是 0 和 42 的方式和原因。

link 1 link 2

当你这样写的时候:

class Program
{

    static readonly int A = Method();
    static readonly int B = 42;
    static int Method() => B;

    static void Main()
    {
        Console.WriteLine(A); // 0
    }
}

编译器会为你生成一个静态构造函数,为你的各个字段赋初值。这些赋值的顺序与字段声明的顺序相匹配:

class Program
{

    static readonly int A;
    static readonly int B;

    static Program()
    {
        A = Method();
        B = 42;
    }

    static int Method() => B;

    static void Main()
    {
        Console.WriteLine(A); // 0
    }
}

当静态构造函数运行时,很明显 Method() 被执行,A 被赋值,然后 B 被赋值。在分配任何内容之前,字段的初始值为 0。所以 Method() 将 return 0.

按照第二个场景的相同逻辑,您将看到它有何不同。