【问题标题】:Are these Virtual Member Call in Constructor warnings legitimate?这些虚拟成员调用构造函数警告是否合法?
【发布时间】:2011-12-09 14:50:29
【问题描述】:

我在设置 EditMyDataObject 属性的基本表单中收到 Resharper 警告,在我获取 Text 值然后在之后恢复它的扩展表单中收到 Resharper 警告。

在这两种情况下,当我运行应用程序时都没有发生任何问题。我认为在实现时不会出现任何问题,因为我的重写属性不依赖于构造函数中初始化的任何内容,但在对 Resharper 作呕之前,我会很感激第二意见。

public class MyDataObject
{
    //Data Members

    public MyDataObject()
    {
    }
}

public class MyDataObjectEx : MyDataObject
{
    //Data Members

    public MyDataObjectEx()
    {
    }

    public MyDataObjectEx(MyDataObject myDataObject)
    {
    }       
}

public partial class MyDataObjectEditFrm : Form
{
    private MyDataObject _myDataObject;

    protected virtual MyDataObject EditMyDataObject
    {
        get { return _myDataObject; }
        set { _myDataObject = value; }
    }

    /// <summary>
    /// Parameterless constructor needed for designer support of derived classes.
    /// </summary>
    protected MyDataObjectEditFrm()
    {
        InitializeComponent();
    }

    protected MyDataObjectEditFrm(MyDataObject myDataObject)
    {
        InitializeComponent();
        EditMyDataObject = myDataObject;  // Warning: Virtual member call in a constructor

        Text = GetDialogNameFromInputParameters()

        //Remainder of initialization here
    }

    GetDialogNameFromInputParameters()
    {
        //Figure out what the text should be
    }
}


public partial class MyDataObjectExEditFrm : MyDataObjectEditFrm
{
    private MyDataObjectEx _myDataObjectEx;

    protected override MyDataObject EditMyDataObject
    {
        get { return _myDataObjectEx; }
        set
        {
            if (value == null)
                _myDataObjectEx = null;
            else _myDataObjectEx = value as MyDataObjectEx ?? new MyDataObjectEx(value);
        }

    }

    public MyDataObjectExEditFrm(MyDataObject myDataObject) : base(myDataObject)
    {
        //preserve the value computed and set in the base class to prevent the generic form name from the designer overriding it here
        string dialogText = Text; // Warning: Virtual member call in a constructor
        InitializeComponent();
        Text = dialogText; // Warning: Virtual member call in a constructor


        //Remainder of additional initialization for extended data here
    }
}

【问题讨论】:

  • 编辑:错了,谢谢丹尼尔如果你愿意,你可以通过设置底层变量而不是属性来删除第一个警告。我对这是否是一个好主意没有意见,我只是说。
  • @jv42:那会改变行为。看看被覆盖的属性,它有一些逻辑......
  • @vj42:我想我试过了,但是当 MyDataObjectExEditForm 只传递一个基本 MyDataObject 因为它没有转换为 MyDataObjectEx 时,它会导致问题
  • 是的,抱歉,我错过了您实际上在派生类中覆盖它的事实。
  • 您始终可以将虚拟调用通过管道传递到抽象方法中,这会强制任何派生类实现此抽象方法。这意味着该类不可能不实现该方法,这意味着继承的类中永远不会出现缺少方法的错误。这个未来证明了你的班级。

标签: c# winforms inheritance resharper


【解决方案1】:

只要每个派生类以不依赖于在该派生类的构造函数中初始化的变量的方式覆盖此虚拟成员,您就是安全的。问题是,您无法知道从您的基类派生的每个类的行为都是这样的。因此,警告是合法的。

【讨论】:

  • 我知道将来有可能把事情搞砸;但由于它不是公共图书馆,因此如果不能在不丢失功能的情况下重新设计它,则风险是可以控制的。
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2014-09-13
相关资源
最近更新 更多