首页 >后端开发 >C++ >C# 的静态类初始化顺序是否保证是确定性的?

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

Barbara Streisand
Barbara Streisand原创
2025-01-04 15:07:40585浏览

Is C#'s Static Class Initialization Order Guaranteed to Be Deterministic?

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

在 C# 中,静态类在首次使用时进行初始化。然而,多个静态类之间的初始化顺序并不总是显而易见的。本文探讨了 C# 中静态类初始化的确定性本质以及它如何影响代码的执行。

确定性初始化顺序

静态类初始化的顺序是受控制的通过以下规则:

  • 如果类中存在静态字段初始值设定项,则它会在类的静态构造函数。
  • 如果类中存在静态构造函数,则当引用该类的任何静态成员或创建该类的实例时,会触发其执行。
  • 如果类包含 Main 方法,其静态构造函数在 Main 之前执行

示例

考虑以下代码:

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);
    }
}

此代码说明了静态类初始化的确定性本质。当 Main 中引用 A.X 时,会执行其静态构造函数。 A.X 使用 B.X 进行初始化,从而触发 B 的初始化。因此,代码的输出始终为:

A.X = 1
B.X = 7
B.X = 0
A = 1, B = 0

结论

静态类初始化C# 中遵循明确定义的顺序。理解这个顺序对于编写按预期运行的代码至关重要。通过遵守上述规则,开发人员可以确保其静态类正确且一致地初始化,即使在多个编译和执行中也是如此。

以上是C# 的静态类初始化顺序是否保证是确定性的?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn