staticコンストラクタはクラスがはじめてつかわれる時に一回だけ呼ばれるコンストラクタ
テスト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ref class A { static A() { Console::WriteLine("static A()"); } }; ref class B : public A { static B() { Console::WriteLine("static B()"); } }; int main() { A a; B b; } |
上記の場合はA→Bの順で呼ばれる。
1 2 3 4 5 |
int main() { B b; A a; } |
上記の場合はB→Aの順で呼ばれる。Bが使われてるところでAも呼ばれる。
考察
上記のAがライブラリのような自分で触れないコードの場合、それがいつ呼ばれるのか、すでに呼ばれているのかを知る一般的な方法はないと思う。Aがstaticコンストラクタでなにかのデータを初期化してる場合はBのstaticコンストラクタにそのデータを書くのは危険だろう。
多重継承できるインターフェースのstaticコンストラクタは呼ばれなかった。