在下面的代码:什么是C#代码做:
public class A
{
public A():this(null){}
public A(string b){/*code here*/}
}
有什么用第一个构造函数的?
在下面的代码:什么是C#代码做:
public class A
{
public A():this(null){}
public A(string b){/*code here*/}
}
有什么用第一个构造函数的?
第一构造函数被传递到null
参数b的第二构造函数。
因此,如果你调用new A()
这将是与调用new A(null)
当你有一个构造函数参数
public A(string b){ /* code here */ }
public A():this("") { } //default
默认的构造函数实际调用“参数的构造”与“”为一个参数。你正在传递一个参数。这样做是为了避免编写相同的代码两次
这是一个默认的构造函数,第二个用b == NULL调用来完成。
幕后发生的操作(例如data-绑定和序列化)将调用默认的构造函数,所以有时可以明确定义你想要在默认构造函数(即无参数)中发生的事情 – rohancragg 2009-10-30 07:40:22
可能有一些其他代码要求A具有默认构造函数,但是我想你:this(null)不是必需的。 – Thomas 2009-10-30 07:42:35
看到这个,当你超载构造发生。
在你的榜样空构造器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
我知道这是一个简单的例子,但我希望这是更清晰。
一些接口或设计人员要求那里有一个“无参数”的构造函数。
这个方法在那些时候派上用场。
有在使用对象初始化参数的默认构造函数是必需的:
Employee e = new Employee() {FirstName="John", LastName="Smith"};
在这种情况下,我可能不会使用构造函数链,虽然。构造函数重载为您提供了一种使用参数进行初始化的替代方法。构造函数链实际上有用的地方在于使构造函数参数可选; C#不支持可选参数(还)。
“最佳实践”将视情况而定,用途,建筑,要求等(ISO咨询规则一:“这要看情况。“)
+1好的答案 - 正如我所说的,Construcotr过载:-) – rohancragg 2009-10-30 07:38:00
正确的术语是”构造函数链“ – 2009-10-30 07:47:51
准确地说,定义多个构造函数是构造函数重载,并让这些构造函数互相调用是构造函数chaining。调用另一个构造函数的代码,例如'this()'或'base(foo)',被称为构造函数初始值设定项。 – Joren 2009-10-30 08:53:04