フィールドの初期化という記事で、フィールドの初期化はコンストラクタで行った方がいいと書きました。「静的フィールドも同様に静的コンストラクタで初期化する。静的フィールドの初期化に関しては、静的コンストラクタで行うのは不適切なようでした。静的コンストラクタはインスタンスコンストラクタと違い、コンパイル時に特殊な処理が行われる。静的コンストラクタを明示的に宣言しない場合、コンパイラが静的コンストラクタを用意してくれる。それだけではなく、beforefieldinitというフラグがそのクラスのMSIL定義に追加される。フラグは追加されない。フラグがない(明示的に静的コンストラクタを宣言した)場合、その型の静的フィールドに初めてアクセスしようとした時、静的コンストラクタが実行される。静的コンストラクタが実行されたかどうかを確認するためのチェックが加えられる。フラグがある(明示的に静的コンストラクタを宣言しない)場合、その型の静的フィールドに初めてアクセスするよりも前に、静的コンストラクタが実行されることが保証される。beforefieldinitフラグがあると、ほとんどの場合、静的コンストラクタが実行されたかどうかを確認するチェックは加えられない。静的コンストラクタが実行されたかどうかのチェックが加えられると、パフォーマンスが低下する場合があるらしい。よって、静的フィールドの初期化は宣言時に行い、静的コンストラクタは明示的に宣言しないようにするのが適切である。]以下のような検証用プログラムを組んでみた。DateTime.Now;}}}検証用プログラムをコンパイルすると、HogeクラスとFooクラスのMSILコードは、以下のようになる。フラグがないことが確認できる。InitTime}検証用プログラムを実行すると、以下のような出力を得られる。実行結果beforefieldinitフラグありの場合の初期化:-0.03125beforefieldinitフラグなしの場合の初期化:0この結果から、beforefieldinitフラグありの場合、静的フィールドにアクセスするよりも前に、静的フィールドの初期化が行われていることがわかる。19:46拡張させることのないクラスにはsealedキーワードを付加してシールクラスとすること。拡張させることのないメンバにはvirtualキーワードを付加しないこと。シールすることによりコンパイラが最適化してくれる。他者に自分の意図しない拡張をされることも防げる。(場合によっては防げないけど・・・w)拡張させることがわかってるクラスや、拡張させる可能性が充分あるクラスは当然シールするわけにはいかないが、それ以外のクラスって大概はシールしちゃっていいと思う。「あとで機能追加させたい時に困る」なんてのはおかしい。そのクラス自体に手を入れれば済んだりするし(つーか、それで済むならそうすべき)、本当にそのクラスを継承して拡張させたい場合もsealedキーワード取り除いてメンバを適切にvirtualにすれば済むだけの話だし。個人的には、クラス作成時にデフォルトでsealedキーワードが書き込まれてて欲しいな。29ブログ内検索カウンターアクセスカウンターおすすめプロフィールAuthor:よこけん性別は男です。生年月日は1984年2月頃です。社会人は2004年4月頃からやってます。C#は2004年10月頃からやってます。このブログは2006年7月頃からやってます。アプリケーションリンクopus-i商用可・加工可で、綺麗な素材を提供していらっしゃいます。紹介していらっしゃいます。中心に扱っていらっしゃいます。コマンドレットをまとめたスナップインです。クラスライブラリを作ってみました。最近の記事ブログ移転しました。返事を返せない場合があります。