web-dev-qa-db-ja.com

静的変数の初期化

今日、同僚と話し合い、次の点を結論付けました。すべてが正しい場合、または何らかの修正が必要な場合は、光を投げてください。

  1. 静的コンストラクターがクラスで定義されていない場合、静的フィールドは使用する直前に初期化されます。
  2. クラスで静的コンストラクターが定義されている場合、静的フィールドは使用直前またはインスタンス作成の一部として(前に)初期化されます。
  3. 静的メソッド内で静的フィールドにアクセスせず、その静的メソッドが呼び出される場合。静的フィールドは、静的コンストラクターがそのクラスで定義されている場合にのみ初期化されます。
  4. 可能であれば、クラスで静的コンストラクターを使用しないでください。
29
Azodious

1.-3。あなたはそれがいつ起こるかを正確に知ることができないので、あなたはそれに依存することはできません。静的コンストラクターは、呼び出されたときに何が起こるかを少し制御します。

public class UtilityClass
{
  //
  // Resources
  //

  // r1 will be initialized by the static constructor
  static Resource1 r1 = null;

  // r2 will be initialized first, as static constructors are 
  // invoked after the static variables are initialized
  static Resource2 r2 = new Resource2();

  static UtilityClass()
  {
    r1 = new Resource1();
  }

  static void f1(){}
  static void f2(){}
}

4.静的コンストラクターが遅い

静的コンストラクターの実行の正確なタイミングは実装に依存しますが、次の規則に従います。

  • クラスの静的コンストラクターは、クラスのインスタンスが作成される前に実行されます。
  • クラスの静的メンバーが実行される前に、クラスの静的コンストラクターが実行されます
    参照。
  • クラスの静的コンストラクターは、クラスの静的フィールド初期化子(存在する場合)の後に実行されます。
  • クラスの静的コンストラクターは、1つのプログラムのインスタンス化中に最大で1回実行されます。
  • 2つの静的コンストラクター間の実行順序
    異なるクラスは指定されていません。
10
sra

あなたのポイントはすべて正しいです。

静的コンストラクターを避けるべき理由は、静的コンストラクターが呼び出されたことを確認するために、クラスのメソッドが呼び出されるすべての場所にコンパイラーがコードを注入するためです。これはパフォーマンスに悪影響を及ぼします。

できることは、デフォルト(または他の非静的)コンストラクターが呼び出されたときにダミー値が割り当てられるプライベート静的フィールドをクラスに持つことです。これにより、オブジェクト作成時にすべての静的フィールドが初期化されます。

4
jaywayco