🐷

モジュール初期化子

2022/09/20に公開

モジュール初期化子とは

最初に1回だけ呼ばれる処理

いつ使う

クラスのインスタンス化を行った際に、最初の1回目だけ行われる処理。
静的コンストラクターでも実施可能だが、C# 9.0にてModuleInitilizer 属性(System.Runtime.CompilerServices 名前空間)を付けて、メソッドを定義すると、対象のメソッドが最初の1回目のインスタンス化の時のみ実行される。

コード例

using System.Runtime.CompilerServices;

Person t1 = new Person();
Person t2 = new Person();
Person t3 = new Person();

class Person
{
    // コンストラクター
    public Person()
    {
        Console.WriteLine("都度よばれる:コンストラクターがよばれた");
    }

    // 静的コンストラクター
    //static Person()
    //{
    //    Console.WriteLine("静的コンストラクターがよばれた。");
    //}

    // モジュール初期化子
    // 関数で定義、且つ、関数名はクラス名に合わせない
    [ModuleInitializer]
    public static void Init()
    {
        Console.WriteLine("最初の1回のみ呼ばれる:モジュール初期化子");
    }
}

深堀り

静的コンストラクターと、モジュール初期化子の違い

  • 1つのクラスに複数かける。
  • 静的コンストラクターの呼び出しには「そのクラスのなんらかのメンバーにアクセス」という条件が付くので、確実に呼び出される保証が実はなかったりします。 モジュール初期化子の呼び出しも「モジュールを読み込む」(モジュールに含まれているなんらかの型に触れる)という条件は付くんですが、静的コンストラクターと比べればだいぶ確実に呼ばれます。 (一切何の型も使わないモジュールを参照すること自体がほとんどないので、実質的には「確実」と行ってしまっても構わないと思います。)

未確認飛行C

Discussion