【问题标题】:Static constructor not working for structs静态构造函数不适用于结构
【发布时间】:2015-07-02 05:18:19
【问题描述】:

环境: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 声明为一个类而不是一个结构,它就可以正常工作。

【问题讨论】:

  • 查看this link,了解如何在结构中设置无参数构造函数。

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


【解决方案1】:

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

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

Console.WriteLine(SavingsAccount.currInterestRate);

输出:

static ctor of SavingsAccount
0,06

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

【讨论】:

  • @vcsjones 在示例中实例化实例使用哪个静态成员?
  • @Matthew 啊废话,我正在阅读关于静态类的部分。我的意思是引用上面说的部分,“静态构造函数的执行由在应用程序域中发生的以下事件中的第一个触发:创建了类的实例。”但这不是一门课。
【解决方案2】:

根据 CLI 规范:

如果没有标记 BeforeFieldInit 那么该类型的初始化方法是 执行于(即被触发):

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 2011-04-19
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多