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

오류가 아닌 이유에 대해서는 Wikipedia에서 확인하십시오.

일부 언어, 특히 C ++의 경우   가상 디스패치 메커니즘에는   다른 의미들   건설 및 파괴   목적. 그 동안 권장되는   생성자의 가상 함수 호출   C ++ [3]에서는 피해야 만하고, 일부에서는   다른 언어 (예 : Java 및   C #은 파생 된 구현이 될 수 있습니다   건설 및 설계 중에 전화   초록 공장과 같은 패턴   패턴은이 용도를 적극적으로 홍보합니다.   능력을 지원하는 언어.

귀하의 질문의 두 번째 부분에 관해서는, ReSharper는 당신이 무엇을하고 있는지 알지 못한다면 예기치 못한 결과를 가져올 수 있기 때문에 ReSharper가 경고합니다. 자세한 내용은 다음을 확인하십시오.

생성자의 가상 멤버 호출

연결된 질문


관련된 질문

최근 질문