まるまるこふこふ

数々の次元が崩壊し、全ての生命が塵と化すのを見てきた。私ほどの闇の心の持ち主でも、そこには何の喜びも無かった。

C#で静的メンバ変数にハッシュを使用する方法

ハロー、さいちゃんです。


C#でプロジェクト全体で共有の定数などを共有する際、MySettingsなどの設定用の静的メンバ変数を含めた静的クラスを作ること、あると思います。

ただ、クラスのメンバ宣言では、初期値を代入する前にゴチャゴチャ処理を行うことはできません。
例えば次のコードはエラーになります。

static class Settings
{
    static public Hashtable ColumnName = new Hashtable(); //ここはOK
    ColumnName.Add("01", "りんご"); //ダメ
    ColumnName.Add("02", "みかん"); //ダメ
    ColumnName.Add("03", "バナナ"); //ダメ
}

ハッシュテーブルは初期化の段階でキーと値を設定することができないので、メンバ変数宣言段階では初期値を代入することができないのです。

これが動的クラスだと、メンバ宣言でとりあえず初期化だけしておいて、コンストラクタで実際にキーと値を渡してやればいいんです。

ただ静的クラスってコンストラクタ呼び出さないで使うんでしょ???さー、どーしよ。



実は静的クラスにも「静的コンストラクタ」というのがあります。

static class Settings
{
        static public Hashtable ColumnName;

        static Settings() //静的コンストラクタ
        {
            ColumnName = new Hashtable();
            ColumnName.Add("01", "りんご");
            ColumnName.Add("02", "みかん");
            ColumnName.Add("03", "なし");
        }
        //動的クラスと違って new Settings()しなくても
        //プロジェクトのどこからでもSettings.ColumnName["キー"]で参照できる!
}

静的コンストラクタは引数を受け取ることはできません。そのため一つのクラスに静的コンストラクタは必ず一つです。オーバーロードの概念はありません。
静的コンストラクタはデフォルトでpublicであり、明示的にアクセスレベルを設定すると、それがpublicであってもエラーになります。



この静的コンストラクタ、いつ呼び出されるのかといえば、クラスのインスタンスが生成された場合(動的クラスで静的コンストラクタを宣言した場合の時ね)、静的メンバにアクセスされた際です。

言語によってはプログラム起動時、Main()より先に呼び出されるらしいですけど、C#ではこの二つのどちらかです。

これで静的メンバ変数にHashtableなどを代入したり、あるいはある程度ゴチャゴチャ処理をしてから
代入したりできますねー。