{{indexmenu_n>22}} ====== staticコンストラクタ ====== ref classやvalue classやinterfaceはそのstaticなメンバーを初期化するためにstaticコンストラクターを定義することができます。ただし以下の制限があります。 * staticコンストラクタはprivateでなければなりません。 * staticコンストラクタはランタイムにより自動的に呼ばれます。プログラムから明示的に呼び出すことはできません。 Note:VC++2005のコンパイラはstaticコンストラクタをpublicにすることも、明示的に呼び出すこともできます。しかし、明示的に呼び出しても実際には呼び出されないようです。 * staticコンストラクタはパラメータ(引数)を持てません。 Note:static initonlyなメンバーは、宣言と同時に初期化するか、staticコンストラクタで初期化しなければなりません。 * staticコンストラクタで例外が発生するとSystem::TypeInitializationExceptionがスローされます。しかし通常catchすることはできません。 * staticデストラクタは存在しません。 using namespace System; ref class A { public: static int a_; static A() { a_ += 10; } }; ref class B { public: static int b_; static B() { // a_ += 10; // error b_ += 10; } }; ref class C { public: static int c_ = 100; static C() { c_ = 10; } }; ref class D { public: static D() { Console::WriteLine(L"D is called"); } }; int main() { Console::WriteLine(A::a_); A::A(); Console::WriteLine(A::a_); Console::WriteLine(B::b_); Console::WriteLine(C::c_); System::Type^ t = D::typeid; Console::WriteLine(t->ToString()); return 0; }