[Effective C#] 項目14 コンストラクタの連鎖を活用する

本日の 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() で親クラスのコンストラクタを呼び出すようにすべきです。でも、これって強制ができないのが痛いんですよねぇ。属性かなんかで指定できればいいのになあ。

コメントを追加

Filtered HTML

  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 使用できるHTMLタグ: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <img>
  • 次のタグを使用してソースコード構文をハイライトすることができます。: <code>, <blockcode>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby> The supported tag styles are: <foo>, [foo].
  • 行と段落は自動的に折り返されます。

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
イメージ CAPTCHA
Enter the characters shown in the image.