Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构造函数中的虚拟成员调用_C#_Visual Studio 2008_Resharper - Fatal编程技术网

C# 构造函数中的虚拟成员调用

C# 构造函数中的虚拟成员调用,c#,visual-studio-2008,resharper,C#,Visual Studio 2008,Resharper,在我的应用程序中,我在不同的上下文中运行相同的winform,以控制按钮的可见性、文本字段和winform标题文本的启用。 我决定这样做的方法是将一个字符串传递给表单构造函数,并使用两个if语句检查它,这些if语句依次包含所需的winform调整 if (formContext == "add") { Text = "Add member"; } if (formContext == "edit") { Text = "Change role"; userTextBox.

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

if (formContext == "add")
{
    Text = "Add member";
}
if (formContext == "edit")
{
    Text = "Change role";
    userTextBox.Enabled = false;
    searchButton.Visible = false;
}
这很好,但是ReSharper添加的“Text”关键字有一条蓝色斜线,带有以下消息:virtualmembercallinconstructor。 这是一个潜在的问题,还是仅仅是某种过于热情的重拾信息


任何关于改进我的实现的澄清或建议都将不胜感激。

基类ctor中的虚拟成员调用可能会导致在调用子类的ctor之前(从而在对象有机会将自身初始化为一致状态之前)在子类中运行一些逻辑


这只是一个很好的提醒,让您知道您正在做的事情可能会导致一些不愉快的意外行为。

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

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

我建议将你们的课程改写如下:

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

把你的班级封起来。

好的。。。这是我一直在思考的问题。任何关于我如何能做得更好的建议。稳定性是这个项目的首要任务,我更愿意避免可能的意外行为。你是说除了不在基类中调用虚拟方法之外的建议?:-)在这种情况下,您可以使用数据绑定将表单的文本属性绑定到GUI模型类中的字符串字段,该字段将包含决定标题栏应显示什么内容所需的逻辑。是。。。我可能可以,虽然我不知道从哪里开始,我想我也必须对按钮和文本字段做同样的操作。这似乎是我试图完成的最简单和最好的解决方案,无需重写大量代码。对我很懒:PYou不需要订阅自己的加载事件,只需要重写OnLoad方法。是的,我同意Ilya的观点-最好是重载这个方法,这样你就不需要记得取消订阅event+(这是一个直觉陈述),可能会更快。不要创建“第二个答案”,这只是让人困惑。此答案本身不符合问题中的“任何澄清或改进建议”要求。删除原始答案并替换为此答案,如图所示进行更新。无法继承密封类,因此派生类不可能重写虚拟成员。