5

我对 C# 中静态变量声明的顺序有疑问

当我运行此代码时:

static class Program {
  private static int v1 = 15;
  private static int v2 = v1;

  static void Main(string[] args) {
   Console.WriteLine("v2 = "+v2);
  }
}

输出是:

v2=15

但是当我像这样更改静态变量声明顺序时:

 static class Program {
      private static int v2 = v1;
      private static int v1 = 15;


      static void Main(string[] args) {
       Console.WriteLine("v2 = "+v2);
      }
    }

输出是:

v2 = 0

为什么会这样?

4

4 回答 4

10

静态字段的初始化顺序与声明的顺序相同。当你v2用 的值初始化时v1v1还没有初始化,所以它的值为 0。

于 2013-03-13T14:59:22.413 回答
4

静态变量是按照它们的声明顺序初始化的,所以当你v2在第二个例子中赋值时,v1仍然有它的默认值0

我希望你知道这样做是个坏主意。

于 2013-03-13T14:59:50.683 回答
2

字段初始化的static顺序与它们的声明相同。

在您的第二个代码中,v1未初始化。既然v1Int32,所以它是一个值类型,并且所有值类型的默认值都是0

从第 74 页的 C#4.0 简而言之。

静态字段初始化程序按照声明字段的顺序运行。

在你的情况下;

private static int v2 = v1;
// v2 initialized 0 because of the default value of value types.
private static int v1 = 15;
// v1 initialized 15
于 2013-03-13T15:01:22.927 回答
2

静态变量获取值的方式意味着在第二个示例中,v1未初始化,因此在分配给时采用默认值 0 v2

于 2013-03-13T14:59:10.830 回答