虚构件成员调用

时间:2009-01-19 12:51:05

标签: c# visual-studio-2008 resharper

在我的应用程序中,我在不同的上下文中运行相同的winform来控制按钮的可见性,文本字段的enabeling和winform头文本。 我决定这样做的方法只是将一个字符串传递给表单构造函数,并使用几个if语句检查它,而这些语句又包含所需的winform调整。

if (formContext == "add")
{
    Text = "Add member";
}
if (formContext == "edit")
{
    Text = "Change role";
    userTextBox.Enabled = false;
    searchButton.Visible = false;
}

这样可以正常工作,但是“Text”关键字得到ReSharper添加的蓝色边框线,并带有以下消息:构造函数中的Viritual成员调用。 这是一个潜在的问题还是只是某种过于热情的ReSharper消息。

非常感谢任何有关改进我的实施的澄清或建议。

4 个答案:

答案 0 :(得分:9)

基类ctor 中的虚拟成员调用会导致某些逻辑在子类'ctor被调用之前在子类中运行(因此在对象有机会将自己初始化为一致之前)状态)。

这只是一个很好的提醒,所以你知道你正在做一些可能会引起一些令人讨厌的意外行为的事情。

答案 1 :(得分:6)

除了现有答案之外,对于表单,您可以添加Load事件处理程序:

Load += delegate
{
    if (formContext == "add")
    {
        Text = "Add member";
    }
    if (formContext == "edit")
    {
        Text = "Change role";
        userTextBox.Enabled = false;
        searchkButton.Visible = false;
    }
};

答案 2 :(得分:4)

密封你的班级。

答案 3 :(得分:0)

我建议按以下方式重写你的课程:

public partial class Form1 : Form
{
    public enum FormContextMode
    {
        Add,
        Edit
    }

    private FormContextMode m_mode = FormContextMode.Add; 

    public Form1( FormContextMode mode )
    {
        InitializeComponent();
        m_mode = mode;
        Load += delegate { UpdateForm(); };
    }

    private void UpdateForm()
    {
        if( m_mode == FormContextMode.Add )
        {
            Text = "Add member";    
        }
        else if( m_mode == FormContextMode.Edit )
        {
            Text = "Change role";
            userTextBox.Enabled = false;
            searchkButton.Visible = false;
        }
    }
}