[Effective C#] 項目14 コンストラクタの連鎖を活用する
作成者:mer 作成日:火, 2010-03-09 21:25
tag:
本日の Effective C# は「項目14 コンストラクタの連鎖を活用する」です。
寒いです…。
コンストラクタが複数ある場合、その初期化処理の実装は悩みものです。初期化処理をメソッドとして書き、コンストラクタからそれを呼び出すとかやりたくなります。
でも、Effective C# によると、この方法は効率が悪いんだそうです。コンストラクタはちょいと特殊で、そのままコンパイルされるわけではないんだそうで、変数初期化子などのコードが追加されるそうです。
コンストラクタの連鎖を利用した場合は、連鎖の最後のコンストラクタにだけそういったコードが追加されるんだそうで。
んで、一番の理由はあれですよね。
readonly フィールドはコンストラクタからしか初期化できないこと、です。
なので、コンストラクタの連鎖を使用し、初期化コードをコンストラクタ内に書くことが重要なんです。
public class Foo private readonly int _bar; private readonly string _buz; public Foo() : this(0) {} public Foo(int bar) : this(bar, "") {} public Foo(int bar, string buz) { _bar = bar; _buz = buz; } }
こんな感じかな。
これならコンストラクタを追加しても、重複したコードがあまりできないから、失敗もしづらいです。
あと、余談ですが、コンストラクタから virtual メソッドなんぞを呼び出そうもんならすっげー痛い目にあいます。abstract パターンとかでやりたくなるんですが…。
なので、こういった場合も、virtual メソッドを呼び出すのではなく、base() で親クラスのコンストラクタを呼び出すようにすべきです。でも、これって強制ができないのが痛いんですよねぇ。属性かなんかで指定できればいいのになあ。
コメントを追加