首页 > 解决方案 > 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是420的输出Scenario 2。这个输出是 0 还是 42?

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

链接 1 链接 2

标签: c#.netconstructorstaticmain

解决方案


当你写这个:

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()会返回 0。

对第二种情况遵循相同的逻辑,您将看到它有何不同。


推荐阅读