3

可能な重複:

コンストラクターでの仮想メンバー呼び出し

まず第一に、C#のctor内で仮想関数を呼び出すのはエラーではないのですか。

第二に、それが許可されている場合、なぜResharperはまだそれについて警告しているのですか?

2 답변


3

すでに答えました:

コンストラクターでの仮想メンバー呼び出し

つまり、コンストラクタが呼び出される順序と関係があります。これは、仮想メソッドが呼び出される順序とは異なります。コンストラクタは、あまり具体的でないものから最も具体的なものまで呼び出されます。最も限定的なものから具体的なものまで。

それはあなたがこの罠に陥ることができることを意味します。

public class Base {
  protected virtual void DoSomething() {
    // do nothing
  }

  public Base() {
    DoSomething();
  }
}

public class Another : Base {
  private List<string> list;

  public Another() {
    list = new List<string>();
  }

  protected override void DoSomething() {
    // this code will raise NullReferenceException,
    // since this class' constructor was not run yet,
    // still, this method was run, since it was called
    // from the Base constructor
    list.Add("something");
  }
}


2

それがエラーではない理由については、ウィキペディアからこれをチェックしてください。

いくつかの言語、特にC ++では、   仮想ディスパッチメカニズム   時の異なる意味   の建設と破壊   オブジェクトお勧めですが   コンストラクターでの仮想関数呼び出し   C ++ [3]については避けるべきです。   他の言語、例えばJavaや   C#では、派生実装は次のようになります。   建設中および設計中に呼び出される   抽象ファクトリーのようなパターン   パターンは積極的にこの使用法を促進します   能力を支える言語。

あなたの質問の後半部分に関しては、ReSharperはそれについて警告しています。詳細については、以下をチェックしてください。

コンストラクターでの仮想メンバー呼び出し

リンクされた質問


関連する質問

最近の質問