具有部分类的静态字段初始化顺序

时间:2015-03-16 21:00:49

标签: c# .net

有没有办法强制部分类中的静态字段初始化顺序?让我们在HelloWorld1.cs中说:

partial class HelloWorld
{
  static readonly string[] a = new[] { "Hello World" };
}

在HelloWorld2.cs的其他地方我有:

partial class HelloWorld
{
  static readonly string b = a[0];
}

如果a在b之前初始化,那么这很好,但是如果b在a之前被初始化则会抛出a。健康的方式可能是使用静态构造函数,但我很好奇,如果在字段类位于同一分部类的不同文件中时有强制或预测初始化顺序的方法。

2 个答案:

答案 0 :(得分:11)

当字段出现在同一个文件中时,文本顺序定义了它们的初始化执行:

  

10.5.5.1变量初始值设定项 - 静态字段初始化

     

类的静态字段变量初始值设定项对应于按照它们在类声明中出现的文本顺序执行的赋值序列。如果类中存在静态构造函数(第10.12节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项在首次使用该类的静态字段之前的实现相关时间执行。

但是,对于在不同文件中声明的分段类的字段,订单是未定义的:

  

10.2.6部分类型 - 成员

     

类型中成员的排序对C#代码来说很少有意义,但在与其他语言和环境交互时可能很重要。 在这些情况下,在多个部分中声明的类型中的成员排序未定义

来自C# language specification

答案 1 :(得分:1)

来自MSDN Documentation

  

类的静态字段变量初始值设定项对应于a   以文本顺序执行的分配顺序   它们出现在类声明中。如果是静态构造函数   (第10.11节)存在于类中,执行静态字段   初始化程序在执行该静态之前立即发生   构造函数。 否则,静态字段初始值设定项执行于   在第一次使用静态之前的实现相关时间   该班的领域。