C#中的初始化顺序有哪些规则?

时间:2012-02-17 20:59:07

标签: c#

  

可能重复:
  What is the static variable initialization order in C#?

为了好玩,我跑了this code

我没想到2 2 3。我期待编译器错误(circlur依赖)或8 5 3

C#中的初始化顺序有哪些规则?

-edit- i tried making a not static我得到了我的预期。为什么b 2之前和现在5.我不认为我会喜欢这些规则......幸运的是我从来没有做过这样的事情,所以我没有遇到任何问题。

using System;

public class Test
{
        public static void Main()
        {
                A.t();
        }
}

class A
{
    static int a = B.b + c;
    public static int c = 3;
    static public void t()
    {
        Console.WriteLine("{0} {1} {2}", a, B.b, c);
    }
}
class B
{
    public static int b = A.c+2;
}

5 个答案:

答案 0 :(得分:5)

在需要时初始化为每种类型(尽管在此之前)。上课:“文字顺序”:

ECMA 334中的§17.11:

  

如果一个类包含带有初始值设定项的任何静态字段,那么这些初始值设定项会在执行静态构造函数之前立即以文本顺序执行。

它不适用于实例字段,因为您无法在字段初始值设定项中使用实例值。

答案 1 :(得分:3)

这一切都很有道理。以下是事件序列:

  1. 您致电A.t
  2. 由于这是第一次使用A,因此其静态成员a初始化为B.b + c
    • 由于这是第一次使用B,因此其静态成员b会初始化为A.c+2。首次使用A ,因此直接读取A.c。由于尚未静态初始化,因此仍将其设置为默认值0。因此B.b变为2。
    • 此时,A的静态初始值设定项从B.b自己0的{​​{1}}到A增加了2,该值仍然设置为默认值为c
  3. 静态初始化的顺序继续,将0设置为A.c
  4. 现在可以使用3A根据t()2 2 3相应字段中存储的值继续打印A

答案 2 :(得分:2)

如果我是你,我总是假设您的编译器以随机(未知)顺序初始化变量。

顺便说一句,static变量与您的类相关联,而不是您的类的任何实例。它们本质上是全局变量。

答案 3 :(得分:2)

初始化按照它在类中出现的顺序发生。所以这就是这里发生的事情:

  1. A已初始化。它开始设置A.a但需要B,所以......
  2. B已初始化。 B.b得到设定 - A.c有效但尚未初始化,所以它是0. B.b变为2.
  3. A.a设置为B.b(2)+ c(尚未设置 - 所以0)。 A.a现在是2。
  4. 最后,c设置为3。

答案 4 :(得分:0)

  

- 编辑 - 我知道我使用的是静态但请解释非静态。我会在一分钟内用非静态测试

非静态字段没有此问题,因为您无法读取尚未构造的对象的实例字段。