有人可能认为我很疯狂,但我是那种喜欢带参数的构造函数的人(如果需要的话),而不是没有参数的构造函数后面再设置属性。我的思路是:如果这些属性在实际构建对象时是必需的,它们应该放在构造函数中。这样我可以获得两个优点:
- 我知道当对象被构建时(没有错误/异常),我的对象是好的。
- 它有助于避免忘记设置某个属性。
这种思维方式对于表单/用户控件开发开始对我造成麻烦。想象一下这个UserControl
:
public partial class MyUserControl : UserControl
{
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
在设计时,如果我将这个 UserControl
拖放到一个窗体上,就会出现一个 Exception
:
在我看来,似乎唯一的解决方法是添加默认构造函数(除非有人知道其他方法)。无法创建组件 'MyUserControl'...
System.MissingMethodException - 未为此对象定义无参构造函数。
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
不包含无参构造函数的整个原因就在于避免使用它。而我甚至不能使用DesignMode
属性来做类似以下的事情:public partial class MyUserControl : UserControl
{
public MyUserControl()
{
if (this.DesignMode)
{
InitializeComponent();
return;
}
throw new Exception("Use constructor with parameters");
}
}
这个也不起作用:
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
好的,继续往下...
我有我的无参构造函数,我可以将其拖放到表单上,表单的InitializeComponent
看起来会像这样:
private void InitializeComponent()
{
this.myControl1 = new MyControl();
// blah, blah
}
相信我,因为我已经这样做了(是的,我忽略了Visual Studio生成的注释),我尝试进行调整并向InitializeComponent
传递参数以便将它们传递给MyControl
的构造函数。
这就导致了下面的问题:
public MyForm()
{
InitializeComponent(); // Constructed once with no parameters
// Constructed a second time, what I really want
this.myControl1 = new MyControl(anInt, aString);
}
我使用带有参数的UserControl
构造函数,是否需要添加一个不需要的第二个构造函数?并且需要实例化控件两次吗?
我感觉我一定做错了什么。有什么想法?意见?保证(希望如此)?