49

インスタンスを作成せずに、クラスの静的コンストラクターを実行したい(つまり、クラスを「ロード」したい)。それ、どうやったら出来るの?

ボーナス質問:.NET 4と以前のバージョンの間に違いはありますか?

編集:

  • クラスは静的ではありません。
  • 実行に時間がかかるため、インスタンスを作成する前に実行したいと思います。最初のアクセスでこの遅延を回避したいと思います。
  • 静的コンストラクターprivate static readonlyはフィールドを初期化するため、代わりにメソッドで実行することはできません。
4

10 に答える 10

121

他の答えは優れていますが、タイプへの参照(つまりリフレクション)なしでクラスコンストラクターを強制的に実行する必要がある場合は、次を使用できますRunClassConstructor

Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
于 2010-04-16T16:42:53.537 に答える
17

静的フィールドの 1 つを参照するだけです。これにより、静的初期化コードが強制的に実行されます。例えば:

public class MyClass
{
    private static readonly int someStaticField;

    static MyClass() => someStaticField = 1;

    // any no-op method call accepting your object will do fine
    public static void TouchMe() => GC.KeepAlive(someStaticField);
}

使用法:

// initialize statics
MyClass.TouchMe();
于 2010-04-16T15:36:01.980 に答える
6

cctor (静的コンストラクター) は、次のいずれかが発生するたびに呼び出されます。

  1. クラスのインスタンスを作成します
  2. すべての静的メンバーがアクセスされます
  3. BeforeFieldInitが設定されている場合、その前の任意の時間

cctor を明示的に呼び出したい場合は、他の静的メンバーがあると仮定して、呼び出し/アクセスするだけです。

cctor であまり興味深いことをしていない場合、コンパイラはそれをマークすることを決定する場合がありますBeforeFieldInit。これにより、CLR は cctor を早期に実行するオプションを使用できるようになります。これについては、こちらで詳しく説明しています: http://blogs.msdn.com/davidnotario/archive/2005/02/08/369593.aspx

于 2010-04-16T15:40:39.790 に答える
3

また、これを行うことができます:

type.TypeInitializer.Invoke(null, null);
于 2018-08-09T04:15:02.780 に答える
2

静的コンストラクターは、静的メソッドにアクセスするときに常に呼び出されるわけではありません!

基本クラスで静的メソッドを呼び出すと、スーパークラスの静的コンストラクターが呼び出されないことに気付きました。この予期しない動作は何度も噛まれました。

于 2016-12-30T15:43:36.047 に答える
-1

これを行う必要はありません。静的コンストラクターの要点は、最初のアクセスでクラスが最初に初期化されるときに一度実行されることです。オンデマンドで何かを実行したい場合は、コンストラクターによって呼び出されるパブリック メソッドに初期化コードを追加することを検討してください。その後、いつでもこのメソッドを呼び出すことができます。しかし、なぜあなたがこれをしたいのかわからないのですか?

于 2010-04-16T15:15:20.513 に答える
-1

他の人が言ったように、静的コンストラクターは自動的に実行されます。明示的にする必要がある場合は、明示的に実行できる静的メソッドにリファクタリングする必要がありますか?

もちろん、静的メソッドを明示的に呼び出すと、静的コンストラクターが実行されたことも保証されます。

編集

静的コンストラクターは、静的メンバーが参照されたときに実行されます。initializeフレームワークが静的コンストラクターを呼び出すことを確認するだけで、何もしないというダミーのメソッドを作成するだけです。

于 2010-04-16T15:29:05.860 に答える
-3

静的コンストラクターは、クラスに初めてアクセスしたときに自動的に実行されます。自分で「実行」する必要(または機能)はありません。

于 2010-04-16T15:12:03.873 に答える