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

在我的应用程序中,我在不同的上下文中运行相同的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消息。

任何澄清或改进我的实施的建议将不胜感激。

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

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

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

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

密封你的class级。

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

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