2009-10-30 140 views
3

在下面的代码:什么是C#代码做:

public class A 
{ 
public A():this(null){} 
public A(string b){/*code here*/} 
} 

有什么用第一个构造函数的?

回答

26

第一构造函数被传递到null参数b的第二构造函数。

因此,如果你调用new A()这将是与调用new A(null)

+0

+1好的答案 - 正如我所说的,Construcotr过载:-) – rohancragg 2009-10-30 07:38:00

+6

正确的术语是”构造函数链“ – 2009-10-30 07:47:51

+6

准确地说,定义多个构造函数是构造函数重载,并让这些构造函数互相调用是构造函数chaining。调用另一个构造函数的代码,例如'this()'或'base(foo)',被称为构造函数初始值设定项。 – Joren 2009-10-30 08:53:04

5

当你有一个构造函数参数

public A(string b){ /* code here */ } 

public A():this("") { } //default 

默认的构造函数实际调用“参数的构造”与“”为一个参数。你正在传递一个参数。这样做是为了避免编写相同的代码两次

1

这是一个默认的构造函数,第二个用b == NULL调用来完成。

+0

幕后发生的操作(例如data-绑定和序列化)将调用默认的构造函数,所以有时可以明确定义你想要在默认构造函数(即无参数)中发生的事情 – rohancragg 2009-10-30 07:40:22

3

这是一个constructor overload

我同意这似乎并没有在这种情况下非常有用,因为最有可能的字符串未初始化值为null反正。

Constructors in C#

+0

可能有一些其他代码要求A具有默认构造函数,但是我想你:this(null)不是必需的。 – Thomas 2009-10-30 07:42:35

3

看到这个,当你超载构造发生。

在你的榜样空构造器public A():this(null){}寻找那些可以在空的对象值的构造函数。因为一个字符串是一个可以占位的对象,所以它会调用该构造函数。

这个例子看起来很简单。

一个更有意义的例子(但仍保持其基本):

public class AddNumbers 
{ 
    public AddNumbers():this(100, 100) 
    {  } 

    public AddNumbers(int x, int y) 
    {  
     int sum = x + y; 
     Console.WriteLine(sum.ToString()); 
    }  
} 
在这个例子中

,当调用程序调用空构造函数,它将输出200,因为它被调用的addNumbers方法与X = 100,Y = 100

我知道这是一个简单的例子,但我希望这是更清晰。

0

一些接口或设计人员要求那里有一个“无参数”的构造函数。

这个方法在那些时候派上用场。

0

有在使用对象初始化参数的默认构造函数是必需的:

Employee e = new Employee() {FirstName="John", LastName="Smith"}; 

在这种情况下,我可能不会使用构造函数链,虽然。构造函数重载为您提供了一种使用参数进行初始化的替代方法。构造函数链实际上有用的地方在于使构造函数参数可选; C#不支持可选参数(还)。

“最佳实践”将视情况而定,用途,建筑,要求等(ISO咨询规则一:“这要看情况。“)