가능한 중복 :
생성자의 가상 멤버 호출
우선 C #에서 ctor 내에서 가상 함수를 호출하는 것이 왜 오류가 아닙니까?
둘째로, 허용된다면, Resharper는 왜 아직도 그것에 대해 경고합니까?
이미 답변 :
즉, 가상 메소드가 호출되는 순서와는 달리 생성자가 호출되는 순서와 관련이 있습니다. 생성자는 구체적이지 않은 것에서부터 가상 메소드가 호출되는 순서대로 호출됩니다 가장 구체적이지 않은 것보다 구체적입니다.
그것은 당신이이 함정에 빠질 수 있음을 의미합니다 :
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");
}
}
오류가 아닌 이유에 대해서는 Wikipedia에서 확인하십시오.
일부 언어, 특히 C ++의 경우 가상 디스패치 메커니즘에는 다른 의미들 건설 및 파괴 목적. 그 동안 권장되는 생성자의 가상 함수 호출 C ++ [3]에서는 피해야 만하고, 일부에서는 다른 언어 (예 : Java 및 C #은 파생 된 구현이 될 수 있습니다 건설 및 설계 중에 전화 초록 공장과 같은 패턴 패턴은이 용도를 적극적으로 홍보합니다. 능력을 지원하는 언어.
귀하의 질문의 두 번째 부분에 관해서는, ReSharper는 당신이 무엇을하고 있는지 알지 못한다면 예기치 못한 결과를 가져올 수 있기 때문에 ReSharper가 경고합니다. 자세한 내용은 다음을 확인하십시오.