可能重复:
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;
}
答案 0 :(得分:5)
在需要时初始化为每种类型(尽管在此之前)。上课:“文字顺序”:
ECMA 334中的§17.11:如果一个类包含带有初始值设定项的任何静态字段,那么这些初始值设定项会在执行静态构造函数之前立即以文本顺序执行。
它不适用于实例字段,因为您无法在字段初始值设定项中使用实例值。
答案 1 :(得分:3)
这一切都很有道理。以下是事件序列:
A.t
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
。0
设置为A.c
。3
,A
根据t()
和2 2 3
相应字段中存储的值继续打印A
答案 2 :(得分:2)
如果我是你,我总是假设您的编译器以随机(未知)顺序初始化变量。
顺便说一句,static
变量与您的类相关联,而不是您的类的任何实例。它们本质上是全局变量。
答案 3 :(得分:2)
初始化按照它在类中出现的顺序发生。所以这就是这里发生的事情:
答案 4 :(得分:0)
- 编辑 - 我知道我使用的是静态但请解释非静态。我会在一分钟内用非静态测试
非静态字段没有此问题,因为您无法读取尚未构造的对象的实例字段。