staticコンストラクタ

ref classやvalue classやinterfaceはそのstaticなメンバーを初期化するためにstaticコンストラクターを定義することができます。ただし以下の制限があります。

Note:VC++2005のコンパイラはstaticコンストラクタをpublicにすることも、明示的に呼び出すこともできます。しかし、明示的に呼び出しても実際には呼び出されないようです。

Note:static initonlyなメンバーは、宣言と同時に初期化するか、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;
}