原則13:適切な方法で静的メンバーを初期化する
3012 ワード
原則13:適切な方法で静的メンバーを初期化する
By D.S.Qiu
他人の労働を尊重し、オリジナルを支持します.転載は出所を明記してください.http://dsqiu.iteye.com
静的メンバ変数は、オブジェクトインスタンスを作成する前に初期化されていることを知っておくべきです.C铉は静的初期化シンタックスと静的構造関数が静的メンバ変数を初期化することを提供する.静的コンストラクタは、他の関数よりも変数、属性がアクセスされていない前に実行される特殊な関数です.この関数を使って静的変数を初期化して、単一のインスタンスモードを完全にしてもいいです.あるいはクラスでまだ使われていない必要な作業があります.コンストラクタを使ってはいけません.特定のprvate関数や他の文法で静的変数を初期化します.
実例初期化と同様に、初期化文法は静的コンストラクタの別の選択である.静的なメンバーを宣言して初期化文法を使うだけです.静的変数の初期化ロジックが複雑であれば、静的コンストラクタを作成できます.
C铉単例モードを実現するための最も一般的な方法は静的構造関数である.コンストラクタをprvateにして、初期化文法を追加します.
public class MySingleton
{
private static readonly MySingleton theOneAndOnly = new MySingleton();
public static MySingleton TheOnly
{
get { return theOneAndOnly; }
}
private MySingleton()
{
}
// remainder elided
}
シングルモデルは上のように実現しやすいです.初期化ロジックがより複雑な場合:
public class MySingleton2
{
private static readonly MySingleton2 theOneAndOnly;
static MySingleton2()
{
theOneAndOnly = new MySingleton2();
}
public static MySingleton2 TheOnly
{
get { return theOneAndOnly; }
}
private MySingleton2()
{
}
// remainder elided
}
実例初期化と同様に、静的初期化文法は任意の静的構造関数の前に実行される.また、あなたの静的初期化文法は、基本的な静的構造関数よりも早く実行されます.
CLRは、タイプが初めて適用空間にアクセスする前に、静的構造関数を自動的に実行する.静的なコンストラクタだけを定義できます.パラメータはありません.したがって,静的コンストラクタに異常が生じるかどうかに注意する必要がある.もし静的なコンストラクタに異常があったら、CLRはあなたのプログラムを終了します.この場合の異常捕獲は非常に陰険である.この時のコードエリアはこのタイプを作成すると、App Domainがアンインストールされるまで失敗します.CLRはこのタイプを初期化するために静的構造関数を実行できない.また試しても、タイプは正しく初期化されません.このタイプのオブジェクト(または任意のサブクラス)は定義されていません.だから、これは許されないことです.
異常は静的初期化文法の代わりに静的構造関数を使用する最も一般的な原因である.静的初期化文法を使っているので、自分で異常を捕まえられません.静的なコンストラクタを使えばいいです.
static MySingleton2()
{
try
{
theOneAndOnly = new MySingleton2();
}
catch
{
// Attempt recovery here.
}
}
静的初期化文法と静的構造関数は最も清潔であり、最も明瞭な方法で静的メンバ変数を初期化する.それらは強い可読性と正確に使用しやすい.これらがサポートされているのは、この他の言語の初期化のために静的なメンバに起こる問題を解決するためです.
リボン:
このことはずっと引きずっていて、ずっと続けたいと思っています.今日もまた頭を振り始めました.翻訳が下手で不明なところが多いので、自分のために伏線を買ってあげましょう.
各種のすっきりしないことを歓迎して、各種は噴きます.これを書くのは個人の趣味です.
本书の他の章の翻訳については、クリックしてを転载してください.
D.S.Qiuに対して何か提案や意見があれば、記事の後ろにコメントしたり、メールしたりすることができます[email protected])交流、励ましと支持は私の前進の原動力です.もっと良い共有ができることを望んでいます.
転載は最初に出典を明記してください.http://dsqiu.iteye.com/blog/2077189.
もっと素晴らしいです.D.S.Qiuのブログとマイクロブログ(ID:静水プログレッシブ)に注目してください.