根据MSDN' design guide for constructors,
"如果您未在类型上明确声明任何构造函数,则许多语言(例如C#)将自动添加公共默认构造函数。 (抽象类获得受保护的构造函数。) 将参数化构造函数添加到类可防止编译器添加默认构造函数。这通常会导致意外的突破性变化。"
为什么不:
"如果您未在某个类型上明确声明任何默认构造函数,则许多语言(例如C#)将自动添加公共默认构造函数。 (抽象类获得受保护的构造函数。)"
这背后的原因是什么?
答案 0 :(得分:13)
因为并非所有类都应构造为无参数。
考虑一个用于实现应用程序与磁盘上文件之间接口的类。必须处理构造对象的情况而不指定要管理的文件将是非常不方便的。
因此,由于创建非静态类的要点是你想要创建它的对象,所以你不必添加一个空的无参数构造函数,如果这就是你想拥有的那个< / em>的
一旦开始在所有处添加构造函数,则会禁用automagic并且不会提供默认构造函数。
答案 1 :(得分:6)
如果我定义一个自定义构造函数,这意味着我的对象需要以特定方式初始化,例如:
{this._multiply(a, b)}
如果编译器还添加了class Customer
{
public Customer(string name) { this.Name = name; }
public string Name { get; }
}
,那么您可以绕过使用名称初始化客户的要求。
答案 2 :(得分:2)
如果没有构造函数,则无法新建该类的实例。
因此,当您提供构造函数时,至少有一种方法来构造该类。如果根本没有提供构造函数,则默认提供一个构造函数,以便您可以实际构建类。
这个答案是为什么默认构造函数存在的问题,但不是为什么当你不创建自己的无参数构造函数时它不存在。
如果在已经提供默认构造函数的情况下提供默认构造函数,则可能导致无意中消耗该类。在另一个答案中已经指出了这方面的一个例子,但就像另一个答案:
public class Foo
{
private readonly IDbConnection _dbConnection;
public Foo(IDbConnection dbConnection)
{
if (dbConnection == null)
throw new ArgumentNullException(nameof(dbConnection));
_dbConnection = dbConnection;
}
public Whatever Get()
{
var thingyRaw = _dbConnection.GetStuff();
var thingy = null; // pretend some transformation occurred on thingyRaw to get thingy
return thingy;
}
}
如果要在上面的类中自动创建默认构造函数,则可以构造没有其依赖项IDbConnection
的类,这不是预期的行为,因此,不应用默认构造函数。 / p>