7

我想为一个类有两个构造函数,如下所示:

public MyClass()
{
    // do stuff here
}

public MyClass(int num)
{
    MyClass();
    // do other stuff here
}

以上是实现我的目的的正确方法吗?有没有更好的速记?

4

5 回答 5

12
public MyClass()
{
    // do stuff
}

public MyClass(int num)
    : this ()
{
    // do other stuff with num
}

: this()位称为Constructor Initialiser。C# 中的每个构造函数都有一个初始化程序,它在构造函数本身之前运行。默认情况下,初始化程序是基类的无参数构造函数(或者Object如果该类不是从另一个类显式派生的)。这可确保在构造派生类的其余部分之前正确初始化基类的成员。

每个构造函数的默认构造函数初始化程序可以通过两种方式覆盖。

  1. : this(...)构造指定同一类中的另一个构造函数作为它所应用的构造函数的初始化程序。
  2. : base(...)构造在基类中指定了一个构造函数(通常不是无参数构造函数,因为无论如何这是默认值)。

有关您可能想要的更多详细信息,请参阅 C# 4.0 语言规范第 10.11 节。

于 2012-08-17T05:12:30.717 回答
5

正确的语法如下所示:

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)
{
}

如果您不想调用基类中的默认无参数构造函数,而是调用带参数的构造函数之一,这将很有用。

于 2012-08-17T05:12:40.730 回答
2

你可以这样做:

public MyClass()
{
    // do stuff here
}

public MyClass(int num) : this()
{

    // do other stuff here
}
于 2012-08-17T05:12:25.833 回答
2

也许使用一个构造函数,其参数具有默认值:

public MyClass(int num = 0)
{
    MyClass();
    // do other stuff here
}
于 2012-08-17T05:12:35.613 回答
0

您可以执行以下操作:

public MyClass()
   : this(1) { }

public MyClass(int num)
{
   //do stuff here
}
于 2012-08-17T05:14:09.477 回答