3

在以下代码中:

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

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

4

7 回答 7

26

第一个构造函数传入null第二个构造函数的参数 b。

因此,如果您调用new A()它将与调用相同new A(null)

于 2009-10-30T07:34:13.060 回答
5

当你有一个带参数的构造函数时

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

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

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

于 2009-10-30T07:35:25.733 回答
3

这是一个构造函数重载

我同意在这种情况下它似乎不是很有用,因为字符串的未初始化值很可能无论如何都是 null 。

另请参见C# 中的构造函数

于 2009-10-30T07:37:03.363 回答
3

当您重载构造函数时会发生这种情况。

在您的示例中,空构造public A():this(null){}函数查找可以接受 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。

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

于 2009-10-30T07:43:18.383 回答
1

这是一个默认构造函数,它使用 b==null 调用第二个。

于 2009-10-30T07:36:46.797 回答
0

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

这种方法在那个时候就派上用场了。

于 2009-10-30T14:22:05.377 回答
0

使用对象初始化时需要有一个无参数的默认构造函数:

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

不过,在这种情况下,我可能不会使用构造函数链接。构造函数重载为您提供了另一种使用参数进行初始化的方法。构造函数链接真正有用的地方在于使构造函数参数可选;C# 不支持可选参数(目前)。

“最佳实践”将取决于情况、使用、架构、要求等。(ISO 咨询规则第一条:“视情况而定。”)

于 2009-10-30T14:30:27.997 回答