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