我想为一个类有两个构造函数,如下所示:
public MyClass()
{
// do stuff here
}
public MyClass(int num)
{
MyClass();
// do other stuff here
}
以上是达到我目的的正确方法吗?有什么样的速记更好吗?
答案 0 :(得分:7)
public MyClass()
{
// do stuff
}
public MyClass(int num)
: this ()
{
// do other stuff with num
}
: this()
位称为构造函数初始化程序。 C#中的每个构造函数都有一个初始化器,它在构造函数本体之前运行。默认情况下,初始化器是基类的无参数构造函数(如果未从另一个类显式派生类,则为Object
)。这可以确保在构造派生类的其余部分之前,基类的成员能够正确初始化。
可以通过两种方式覆盖每个构造函数的默认构造函数初始化程序。
: this(...)
构造指定同一类中的另一个构造函数作为应用它的构造函数的初始化器。 : base(...)
构造指定基类中的构造函数(通常不是无参数构造函数,因为这是默认值)。有关详细信息,请参阅C#4.0语言规范部分10.11。
答案 1 :(得分:4)
正确的语法如下所示:
public MyClass()
{
// do stuff here
}
public MyClass(int num) : this()
{
// do other stuff here
}
注意第二个构造函数的this()
。这会在没有参数的同一个类中调用构造函数。
你也可以反过来说:
public MyClass() : this(someReasonableDefaultValueForNum)
{
}
public MyClass(int num)
{
// do all stuff here
}
在this
这个地方只能使用一个“功能”代替base
:
public MyClass(int num) : base(someParameterOnTheBaseClassConstructor)
{
}
如果您不想在基类中调用默认的无参数构造函数,而是调用带参数的构造函数,那么这很有用。
答案 2 :(得分:2)
你可以这样做:
public MyClass()
{
// do stuff here
}
public MyClass(int num) : this()
{
// do other stuff here
}
答案 3 :(得分:1)
也许使用一个带有参数默认值的构造函数:
public MyClass(int num = 0)
{
MyClass();
// do other stuff here
}
答案 4 :(得分:0)
您可以执行以下操作:
public MyClass()
: this(1) { }
public MyClass(int num)
{
//do stuff here
}