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

Static constructor not working for structs

环境: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();
      }
  }

}

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

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

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

Console.WriteLine(SavingsAccount.currInterestRate);

输出:

static ctor of SavingsAccount
0,06

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

根据 CLI 规范:

If not marked BeforeFieldInit then that type’s initializer method is executed at (i.e., is triggered by):

  1. first access to any static field of that type, or
  2. first invocation of any static method of that type, or
  3. first invocation of any instance or virtual method of that type if it is a value type or
  4. first invocation of any constructor for that type

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