静态构造函数不适用于结构

时间:2015-04-23 20:07:28

标签: c# visual-studio visual-studio-2015 static-constructor c#-6.0

环境:C#6,Visual Studio 2015 CTP 6

给出以下示例:

namespace StaticCTOR
{
  struct SavingsAccount
  {
      // static members

      public static double currInterestRate = 0.04;

      static SavingsAccount()
      {
          currInterestRate = 0.06;
          Console.WriteLine("static ctor of SavingsAccount");
      }
      //

      public double Balance;
  }

  class Program
  {
      static void Main(string[] args)
      {
          SavingsAccount s1 = new SavingsAccount();

          s1.Balance = 10000;

          Console.WriteLine("The balance of my account is \{s1.Balance}");

          Console.ReadKey();
      }
  }

}

由于某种原因,静态ctor没有被执行。如果我将SavingsAccount声明为一个类而不是一个结构,它就可以正常工作。

2 个答案:

答案 0 :(得分:13)

静态构造函数没有被执行,因为你没有使用结构的任何静态成员。

如果使用静态成员currInterestRate,则首先调用静态构造函数:

Console.WriteLine(SavingsAccount.currInterestRate);

输出:

static ctor of SavingsAccount
0,06

当您使用类时,将在创建实例之前调用静态构造函数。为结构调用构造函数不会创建实例,因此它不会触发静态构造函数。

答案 1 :(得分:0)

根据CLI规范:

如果未标记BeforeFieldInit,则该类型的初始化方法为 在以下位置执行(即由触发):

  1. 首先访问该类型的任何静态字段,或
  2. 首次调用该类型的任何静态方法,或
  3. 首次调用该类型的任何实例或虚拟方法(如果它是值类型或
  4. 该类型的任何构造函数的首次调用

对于具有隐式默认构造函数的结构,实际上不会调用它,因此您可以创建实例并访问其字段。其他所有内容(调用自定义构造函数,实例属性访问,方法调用,静态字段访问)都将触发静态构造函数调用。 另外请注意,调用在结构中未覆盖的继承的Object方法(例如ToString())不会触发静态构造函数调用。