【问题标题】:Can we really call parameterless constructors default constructors?我们真的可以将无参数构造函数称为默认构造函数吗?
【发布时间】:2015-04-20 10:36:38
【问题描述】:

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

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

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

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

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

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

或者这个术语真的适用只适用于隐式生成的构造函数?

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

【问题讨论】:

  • Po-tae-toe,Po-ta-toe。你似乎一点也不困惑。您在隐式生成的无参数构造函数的上下文中了解默认与无参数。除了争论语义,陈述事物的上下文和观点之外,几乎不需要进一步探索这个主题。继续你的生活。
  • 如果你喜欢收集这种被滥用的术语,你可能还想看看条件运算符(它是 a 三元运算符,目前只有一个,但是那不是它的名字);按引用传递与按值传递;可选参数和命名参数(以及一般的参数/参数,老实说)。

标签: default-constructor c# constructor terminology default-constructor


【解决方案1】:

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

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

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

... 调用List&lt;T&gt; 的默认构造函数,然后添加到它等等——那么挑剔我们实际上是在调用无参数构造函数是没有意义的。 (如果不查看源代码,我们甚至无法判断它是否是默认构造函数——这个概念只在实现中有意义,而不是从外部看。)

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

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

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

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

public class Derived : Base
{
}

将调用基类构造函数的默认构造函数称为存在对base() 的显式调用会更准确,并且会发生重载决议等的正常过程。

下一步:

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

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

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多