6

静的コンストラクターは、静的メンバーに初めてアクセスしたときに実行されます。これを知って、私はいくつかの質問があります:

  • これは、静的メソッドにアクセスするたびに、ランタイムが静的コンストラクターが呼び出されたかどうかを確認する必要があることを意味しますか?
  • これによりパフォーマンスが低下しますか?
  • 「コンストラクターレス」静的クラスは、このパフォーマンスへの影響を回避しますか?

[編集]:私はマイクロ最適化には関心がないことを明確にしたいと思います。これは設計上の決定
であるため、私はこの質問をしています。静的コンストラクターでパフォーマンスが低下した場合は、それを念頭に置いてコードを設計し、パフォーマンスに影響を与える可能性のある決定をよりよく認識します。

これが私の質問を説明するための例です。Independentメソッドを取得して別の静的クラスに入れることの利点はありますか?そうすれば、staticTestが初期化されているかどうかを確認する必要がなくなります。[更新より良い、より簡単な例については、以下の私の答えを参照してください]。

static class Test {
  // Static constructor with dependent method:
  static int x;
  static Test() { x = 5; }
  static int Dependent() { return x; }

  // Static, independent method:
  static int Independent(int y) { return y+1; }
}

静的コンストラクターに関するC#仕様からの引用は次のとおりです。

静的コンストラクターの実行は、アプリケーションドメイン内で発生する次のイベントの最初のものによってトリガーされます。

  • クラスのインスタンスが作成されます。
  • クラスの静的メンバーのいずれかが参照されます。
4

3 に答える 3

2

自分でテストしてみませんか?

上記のように、Independentメソッドを何度も呼び出します。次に、同じメソッドを使用して独自の静的クラスを作成し、同じ回数呼び出します。

測定にはhttp://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspxを使用してください。

私の推測では、それは問題ではないでしょう...

静的コンストラクターのコンソールに何かを書き込んで、呼び出されたかどうかを確認することもできます。自分で調べることは、いくつかの理論的な答えよりも長く続きます。私の2セントです。

于 2011-11-15T09:52:26.850 に答える
0

静的コンストラクターは、最初のメソッド呼び出し元のパフォーマンスを低下させる可能性があります。Indead、最初の呼び出し元は、静的コンストラクターが既に呼び出されているかどうかをテストするように変更されますが、影響を受けない場合は他の呼び出し元がテストされます。

于 2015-01-05T18:08:55.747 に答える