我们真的可以调用无参数构造函数的默认构造函数吗?

Min*_*s97 2 c# constructor terminology default-constructor

我对C#中"默认构造函数"的含义感到非常困惑.很多人,包括我的编程教授,只是调用任何无参数构造函数"默认构造函数"(就像这里这里的问题和答案一样).即使是上的SO标签wiki 也说它是"无参数构造函数......经常(注意它经常说,而不是总是)由编译器生成".

如果要遵循此逻辑,构造函数是否为"默认"依赖于您可以如何调用它.即如果您可以将其称为"默认"方式,没有任何参数,则它是默认构造函数.

但是,MSDN,如果我正确地读它,似乎只将名称"default constructor"赋予无参数构造函数,该构造函数在没有指定其他构造函数时隐式生成,调用无参数基类构造函数,并且(与任何其他构造函数一样)将class字段初始化为其值.

考虑一下,这比"default" == "parameterless"以下更有意义:当您没有选择任何其他内容时,隐式生成的构造函数有点像默认选项.

那么,调用所有无参数构造函数的默认构造函数是否正确

或者是它正确调用明确定义形式的构造函数public C(): base() {}(普通班)和protected C(): base() {}(抽象类)默认的构造函数,因为它们适合在MSDN默认构造函数的说明?

或者该术语是否仅适用于隐式生成的构造函数?

另外(可能是最重要的问题):这是该术语最广泛接受的定义,是正确还是不正确?

Jon*_*eet 9

不仅仅是MSDN使用术语"默认构造函数"专门用于"如果你没有指定任何其他东西"或"总是,对于结构(前C#6)"或"总是,对于结构"提供的构造函数,除非你指定自己的无参数构造函数(C#6)" - 这是C#语言规范本身.请注意,对于结构体,编译器不需要在IL中为您生成一个 - 它已经作为类型系统的一部分存在.

就个人而言,我发现它是一个有用的区别 - 特别是在专门讨论构造函数语义时.当构造函数不是讨论的主要观点时,对它迂腐是没有用的 - 例如,如果有人在谈论LINQ,并描述了以下代码:

List<int> x = new List<int>();
x.Add(10);
int y = x.First();
Run Code Online (Sandbox Code Playgroud)

...作为调用默认构造函数List<T>然后添加到它等等 - 然后在挑剔我们实际上调用无参数构造函数是没有意义的.(我们甚至不能在不查看源代码的情况下判断它是否是默认构造函数 - 这个概念在实现中才有意义,而不是来自外部,因为它是.)

还有一个微妙的区别,即使规范出错(我应该提出一个错误).考虑C#5规范中的这个陈述:

如果类不包含实例构造函数声明,则会自动提供默认实例构造函数.该默认构造函数只是调用直接基类的无参数构造函数.

情况不一定如此.尽管Base没有无参数构造函数,但此代码编译良好:

public class Base
{
    public Base(int x = 0)
    {
        Console.WriteLine("Base: x={0}", x);
    }
}

public class Derived : Base
{
}
Run Code Online (Sandbox Code Playgroud)

讨论调用基类构造函数的默认构造函数会更准确,就好像存在显式调用一样base(),正常的重载解析过程也会发生.

下一个:

另外(可能是最重要的问题):这是该术语最广泛接受的定义,是正确还是不正确?

我会说大多数人甚至都没有考虑过,并且可以互换使用这两个词.这不是他们认为定义是这样或那样的问题 - 我怀疑定义它的想法并不适用于大多数人.(这不是为了贬低他们 - 这不是他们发现他们需要关心的事情.不是每个人都想成为一名语言律师.)