我从 ListBox 继承。我需要显式调用基本构造函数吗?
public class MyListBox : ListBox
{
public MyListBox() : base()
{
}
// or
public MyListBox()
{
}
}
我从 ListBox 继承。我需要显式调用基本构造函数吗?
public class MyListBox : ListBox
{
public MyListBox() : base()
{
}
// or
public MyListBox()
{
}
}
您列出的两个选项将编译为相同的代码。
包含的唯一原因: base()
是明确表示您正在调用基类默认构造函数,而不是设计的其他构造函数。如果离开,这会自动发生。因此,这完全是可选的。
但是,如果要使用基类的无参数构造函数以外的构造函数,则必须明确说明这一点,即:
public MyListBox() : base("Foo")
{ }
这将显式使用接受字符串作为参数的构造函数。
如果您未指定要调用的构造函数,则会隐式执行默认构造函数的调用。当您省略构造函数调用时,C# 将为您调用默认的构造函数;如果没有默认构造函数,您的代码将无法编译。
10.11.1 构造函数初始化器
所有实例构造函数(除了类对象的构造函数)都隐含地在构造函数主体之前包含对另一个实例构造函数的调用。
[...]
如果实例构造函数没有构造函数初始化器,
base()
则隐式提供表单的构造器初始化器。
根据 C# 规范,您问题中的两个代码片段彼此等效。