2012-08-17 72 views
3

我想有两个构造一类,如下所示:如何简化多个构造函数?

public MyClass() 
{ 
    // do stuff here 
} 

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

是正确的方式来达到我的目的上面?有什么比较好的速记?

回答

6
public MyClass() 
{ 
    // do stuff 
} 

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

: this()位被称为构造函数初始化器。 C#中的每个构造函数都有一个在构造函数本体之前运行的初始化程序。默认情况下,初始化程序是基类的无参数构造函数(如果该类不是从另一个类明确派生的话,则为Object)。这可以确保基类的成员在构造派生类的其余部分之前正确地初始化。

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

  1. : this(...)构造指定在同一个类中的另一个构造函数作为它应用于其构造函数的initiliser。
  2. : base(...)构造在基类中指定了一个构造函数(通常不是无参数构造函数,因为这是默认的)。

有关详细信息可能比你想看到C#4.0语言规范部分10.11。在第二构造

public MyClass() 
{ 
    // do stuff here 
} 

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

注意this()

2

你可以这样说:

public MyClass() 
{ 
    // do stuff here 
} 

public MyClass(int num) : this() 
{ 

    // do other stuff here 
} 
+0

可以在任何其他功能来代替'这个()'在这种情况下? – CJ7 2012-08-17 05:13:20

+0

@ CJ7这不是一个功能。这是一个特殊的语法结构。只有'this(..)'和'base(..)'是允许的。请参阅[使用构造函数](http://msdn.microsoft.com/zh-cn/library/ms173115%28v=vs.110%29.aspx)。 – 2012-08-17 05:27:04

1

也许使用一个构造函数的默认值的参数:

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

正确的语法看起来是这样的。这将在不带参数的同一个类中调用构造函数。

你也可以把它周围的其他方法:

public MyClass() : this(someReasonableDefaultValueForNum) 
{ 
} 

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

只有一个更“功能”则可以改为在这个地方是base使用this

public MyClass(int num) : base(someParameterOnTheBaseClassConstructor) 
{ 
} 

这如果您不想在基类中调用默认的无参数构造函数,但是需要使用参数的构造函数之一,则它非常有用。

+1

这被称为构造函数链。 – 2012-08-17 05:42:35

0

你可以做到以下几点:

public MyClass() 
    : this(1) { } 

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