【发布时间】:2009-11-23 16:32:53
【问题描述】:
说我疯了,但我是那种喜欢带参数的构造函数(如果需要)的人,而不是不带参数的构造函数,然后设置属性。我的思考过程:如果实际构造对象需要属性,它们应该放在构造函数中。我有两个好处:
- 我知道当一个对象被构造时(没有错误/异常),我的对象是好的。
- 有助于避免忘记设置某个属性。
在表单/用户控件开发方面,这种心态开始伤害我。想象一下这个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 生成的 cmets),我试着搞砸了,我将参数传递给 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,我必须添加第二个不需要的构造函数吗?并实例化控件两次?
我觉得我一定做错了什么。想法?意见?保证(希望如此)?
【问题讨论】:
标签: c# winforms parameters constructor user-controls