我们真的可以将无参数构造函数称为默认构造函数吗?

Can we really call parameterless constructors default constructors?

我对C#中"default constructor"的含义很困惑。许多人,包括我的编程教授,只是调用任何无参数构造函数 "default constructor" (就像在问答中 here or here). Even the SO tag wiki on 说它是 "a parameterless constructor... often (note that it says often, not always) generated by the compiler".

如果要遵循这个逻辑,构造器是不是"default"取决于你如何调用它。 IE。如果你可以用 "default" 的方式调用它,不带任何参数,它就是默认构造函数。

但是,MSDN,如果我没看错的话,似乎只将名称 "default constructor" 赋予无参数构造函数,该构造函数是 在未指定其他构造函数时隐式生成的,调用无参数基础 class 构造函数,并且(与任何其他构造函数一样)将 class 的字段初始化为它们的值。

仔细想想,这比 "default" == "parameterless" 更有意义:隐式生成的构造函数有点像 默认选项 当你没有选择任何其他东西时.

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

是否正确调用public C(): base() {}(对于常规classes)和protected C(): base() {}(对于abstract classes) 默认构造函数,因为它们符合 MSDN 上对默认构造函数的描述?

或者术语真的适用仅适用于隐式生成的构造函数吗?

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

不只是 MSDN 专门针对 "if you don't specify anything else" 或 "always, for a struct (pre C# 6)" 或 "always, for a struct, unless you specify your own parameterless constructor (C# 6)" 提供的构造函数使用术语 "default constructor" - 它是 C# 语言规范本身.请注意,对于结构,编译器不需要在 IL 中为您生成一个结构 - 它已经作为类型系统的一部分存在。

就我个人而言,我发现做出区分是很有用的 - 特别是在专门讨论构造函数语义时。当构造函数不是讨论的重点时,迂腐就没那么有用了——例如,如果有人在谈论 LINQ,并描述了以下代码:

List<int> x = new List<int>();
x.Add(10);
int y = x.First();

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

还有一个更细微的区别,甚至规范也会出错(我应该提出一个错误)。考虑 C# 5 规范中的这条语句:

If a class contains no instance constructor declarations, a default instance constructor is automatically provided. That default constructor simply invokes the parameterless constructor of the direct base class.

不一定如此。这段代码编译得很好,尽管 Base 没有无参数构造函数:

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

public class Derived : Base
{
}

更准确的说法是默认构造函数调用基础 class 构造函数,就好像存在对 base() 的显式调用,并进行重载解析等正常过程。

下一个:

Also (probably the most important question): which is the most widely accepted definition of the term, be it correct or incorrect?

我想说大多数人甚至都没有想过它,而是交替使用这两个术语。这不是他们认为定义是一种或另一种方式的问题——我怀疑大多数人都没有想到定义它的想法。 (这不是贬低他们——这不是他们发现需要关心的事情。不是每个人都想成为一名语言律师。)