在构造函数中访问实现的抽象属性会导致CA2214

时间:2018-09-21 08:18:50

标签: c# constructor

我正在使用代码分析,但是构造函数中的Overridable方法有问题

public partial class ControlAdmin : INotifyPropertyChanged
{
    private readonly DatabaseManagement _dm = new DatabaseManagement();
    // more stuff.....
}

1 个答案:

答案 0 :(得分:1)

作为警告状态,您不应从构造函数中调用类的虚拟成员,因为在调用Method时,您的成员可能未完全初始化。请考虑以下示例。

class Foo
{
    protected Bar _someBar;

    public Foo()
    {
        _someBar = new Bar();
       InitBar();
    }

    protected void InitBar()
    {
        _someBar.SomeImportentMethod();
    }
}

class Baz : Bar
{

    private int _id:

    public Baz(int id) : base()
    {
         _id = id;
    }

    protected override InitBaz()
    {
       base.InitBaz();
        _someBaz.Id = _id;
    }
}

在此代码中,您尝试访问派生类(_id)的成员变量。但是在执行InitBaz时,该变量尚未赋值,因此您将使用错误的值初始化_someBaz。 CA2214会警告您该危险。