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

标签 c# constructor terminology default-constructor

我对 C# 中“默认构造函数”的含义感到很困惑。许多人,包括我的编程教授,只是将任何无参数构造函数称为“默认构造函数”(如在问题和答案中 herehere )。甚至 上的 SO 标签 wiki 也说它是“一个无参数的构造函数……经常(注意它说经常,不总是)由编译器生成”。

如果要遵循此逻辑,构造函数是否为“默认”取决于您如何调用它。 IE。如果你可以用“默认”方式调用它,不带任何参数,它就是一个默认构造函数。

但是,如果我没看错的话,MSDN 似乎只给无参数构造函数命名为“默认构造函数”,在没有指定其他构造函数时隐式生成,调用无参数基类构造函数,并且(与任何其他构造函数一样)将 class 的字段初始化为它们的值。

考虑一下,这比 "default"== "parameterless" 更有意义:隐式生成的构造函数有点像默认选项,当你没有'选择其他任何东西。

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

或者调用public C(): base() {}(对于常规类)和protected C 形式的明确定义的构造函数是否正确 (): base() {}(对于抽象类)默认构造函数,因为它们符合 MSDN 上对默认构造函数的描述?

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

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

最佳答案

不仅仅是 MSDN 将术语“默认构造函数”专门用于“如果您未指定任何其他内容”或“始终,对于结构(C# 6 之前)”或“始终,对于结构,除非您指定自己的无参数构造函数 (C# 6)”——它是 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
{
}

将调用基类构造函数的默认构造函数称为对 base() 的显式调用会更准确。出现了,并且发生了过载解析等正常过程。

下一步:

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

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

关于c# - 我们真的可以将无参数构造函数称为默认构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28600351/

相关文章:

c# - 将除法舍入为整数的正确方法是什么?

c# - SQL表中行的增量值

oop - 依赖/依赖是什么意思?

cloud - 虚拟化中机器镜像和实例之间的区别?

algorithm - 普通案例、基本案例和边缘案例之间有什么区别?

c# - 取消执行并在方法重新进入时重新执行

c# - MySql 异常 : Connection need to valid and open. C#

c++ - C++中的抽象类和构造函数

c++ - 一个类中有多个构造函数

c++ - 在 C++ 中,是否可以在构造函数中访问静态变量?