ホームページ > バックエンド開発 > C++ > C# の静的クラスの初期化順序は予測可能ですか?

C# の静的クラスの初期化順序は予測可能ですか?

DDD
リリース: 2025-01-04 20:15:41
オリジナル
860 人が閲覧しました

Is C#'s Static Class Initialization Order Predictable?

C# の静的クラスの初期化順序は決定的ですか?

C# の静的クラスの初期化順序は確かに決定的です。 ECMA-334 標準によると:

  • 静的フィールド初期化子は、静的コンストラクターの直前に実行されます。
  • 静的コンストラクターの実行は、静的フィールドの最初の使用によってトリガーされます。または、クラスのインスタンスが作成されたとき。
  • クラスに Main() が含まれる場合、その静的コンストラクターはその前に実行されます。 Main() が呼び出されます。

初期化順序の例

次のコードを考えてみましょう:

static class B
{
    public static int X = 7;
    static B()
    {
        Console.WriteLine("B.X = " + X);
        X = A.X;
        Console.WriteLine("B.X = " + X);
    }
}

static class A
{
    public static int X = B.X + 1;
    static A() { Console.WriteLine("A.X = " + X); }
}

static class Program
{
    static void Main()
    {
        Console.WriteLine("A = {0}, B = {1}", A.X, B.X);
    }
}
ログイン後にコピー

実行順序

  1. A.X は以下で使用されますMain()、A() の初期化をトリガーします。
  2. A().X の初期化には B.X が必要です。B() を呼び出します。
  3. B().X は 7 に初期化されます (Console.WriteLine ("B.X = 7")).
  4. B().X が変更され、Console.WriteLine("B.X = 0") が実行されます。
  5. A().X は B.X 1 (Console.WriteLine("A.X = 1")) に設定されます。
  6. Console.WriteLine("A = 1, B = 0") が出力されます。

再配置考慮事項

クラス A と B が再配置された場合でも、A.X の最初の使用によって初期化チェーンがトリガーされるため、初期化の順序は変わりません。

結論

静的クラスの初期化の順序は決定的であり、「 ECMA-334規格。静的メンバーの最初の使用またはインスタンスの作成により、初期化プロセスがトリガーされ、フィールド初期化子、静的コンストラクターの順序で進行します。

以上がC# の静的クラスの初期化順序は予測可能ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート