9

環境: 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 を構造体ではなくクラスとして宣言すると、問題なく動作します。

4

2 に答える 2

0

CLI仕様によると:

BeforeFieldInit がマークされていない場合、その型の初期化メソッドが実行されます (つまり、トリガーされます):

  1. そのタイプの静的フィールドへの最初のアクセス、または
  2. そのタイプの静的メソッドの最初の呼び出し、または
  3. 値型または値型の場合、その型のインスタンスまたは仮想メソッドの最初の呼び出し
  4. その型の任意のコンストラクターの最初の呼び出し

暗黙的なデフォルト コンストラクターを持つ構造体の場合、実際には呼び出されないため、インスタンスを作成してそのフィールドにアクセスできます。その他すべて (カスタム コンストラクターの呼び出し、インスタンス プロパティ アクセス、メソッド呼び出し、静的フィールド アクセス) は、静的コンストラクターの呼び出しをトリガーします。Objectまた、構造体でオーバーライドされていない継承されたメソッド (例: ToString()) を呼び出しても、静的コンストラクターの呼び出しはトリガーされないことに注意してください。

于 2020-01-15T14:57:13.577 に答える