C#中静态类初始化的顺序是否确定?

我已经做了一些搜索,并且我认为以下代码可以保证产生输出:


B.X = 7


B.X = 0


A.X = 1


A = 1, B = 0

static class B

{

    public static int X = 7;

    static B() {

        Console.WriteLine("B.X = " + X);

        X = A.X;

        Console.WriteLine("B.X = " + X);

    }

}


static class A

{

    public static int X = B.X + 1;

    static A() {

        Console.WriteLine("A.X = " + X);

    }

}


static class Program

{

    static void Main() {

        Console.WriteLine("A = {0}, B = {1}", A.X, B.X);

    }

}

我已经运行了无数次,并且始终在代码部分上方获得输出;我只是想确认它会改变吗?即使从文字上讲,班级A和班级也要B重新安排?


是否保证首次使用静态对象会触发其静态成员的初始化,然后实例化其静态构造函数?对于此程序,A.X在main中使用将触发的初始化,然后A.X依次初始化B.X,然后B()在完成初始化后A.X继续进行A()。最后,Main()将输出A.X和BX`。


RISEBY
浏览 630回答 3
3回答

梵蒂冈之花

C#规范中涉及大约四个不同的规则,以确保此保证,并且特定于C#。.NET运行时唯一的保证是类型初始化在使用类型之前就开始了。在类型初始化程序运行之前,将静态字段初始化为零。静态字段初始化程序在静态构造函数之前立即运行。在第一个实例构造函数调用或第一个静态成员引用处将调用静态构造函数。该函数参数按从左到右的顺序求值。依赖于此是一个非常糟糕的主意,因为它可能会使任何人都无法阅读您的代码,特别是如果他们熟悉使用类似语法的语言,而这并不能保证以上所有这四个条件。请注意,Porges的评论与我的最初声明(基于.NET行为)有关,后者的保证太弱,无法确保观察到的行为。波尔格斯说保证足够强大是正确的,但实际上涉及的链要比他建议的复杂得多。

至尊宝的传说

您可能想知道,甚至有可能在默认初始化和变量初始化之间为字段分配值。private static int b = Foo();private static int a = 4;private static int Foo(){    Console.WriteLine("{0} - Default initialization", a);    a = 3;    Console.WriteLine("{0} - Assignment", a);    return 0;}public static void Main(){    Console.WriteLine("{0} - Variable initialization", a);}输出0 - Default initialization3 - Assignment4 - Variable initialization
打开App,查看更多内容
随时随地看视频慕课网APP