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などを代入したり、あるいはある程度ゴチャゴチャ処理をしてから
代入したりできますねー。