C#构造函数 - 为什么默认构造函数仅在没有构造函数时由编译器生成,而不是在没有默认构造函数

时间:2016-06-15 11:05:10

标签: c# .net constructor

根据MSDN' design guide for constructors

  

"如果您未在类型上明确声明任何构造函数,则许多语言(例如C#)将自动添加公共默认构造函数。 (抽象类获得受保护的构造函数。)   将参数化构造函数添加到类可防止编译器添加默认构造函数。这通常会导致意外的突破性变化。"

为什么不:

  

"如果您未在某个类型上明确声明任何默认构造函数,则许多语言(例如C#)将自动添加公共默认构造函数。 (抽象类获得受保护的构造函数。)"

这背后的原因是什么?

3 个答案:

答案 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>