Resharper警告在构造函数中使用虚函数,但与C ++不同,它不是错误

时间:2010-07-19 15:46:39

标签: c# .net resharper

  

可能重复:
  Virtual member call in a constructor

首先,为什么在C#中调用ctor中的虚函数不是一个错误?
其次,如果允许的话,为什么Resharper仍然会对此发出警告?

2 个答案:

答案 0 :(得分:3)

已经回答:

Virtual member call in a constructor

简而言之,它与调用构造函数的顺序有关,这与调用虚方法的顺序不同:构造函数从较不具体到最特定的调用,而虚方法被称为从最具体到最不具体的。

这意味着你可以陷入这个陷阱:

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");
  }
}

答案 1 :(得分:2)

至于为何不是错误,请从维基百科查看:

  

对于某些语言,特别是C ++,   虚拟调度机制有   不同的语义   建设和破坏   宾语。虽然建议   构造函数中的虚函数调用   对于C ++应该避免使用[3]   其他语言,例如Java和   C#,派生实现即可   在施工和设计期间调用   抽象工厂等模式   模式积极推动这种用法   支持这种能力的语言。

至于你问题的第二部分,ReSharper警告它,因为虽然你可能会被允许,但如果你不知道你在做什么,它会产生一些意想不到的结果。有关详细信息,请查看:

Virtual member call in a constructor