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

时间:2015-02-19 06:59:00

标签: c# constructor terminology default-constructor

我对"默认构造函数"的含义感到非常困惑。在C#中。许多人,包括我的编程教授,只需调用任何无参数构造函数"默认构造函数" (例如问答herehere)。甚至上的SO标签wiki也说它是一个无参数的构造函数......经常(注意它经常说,并不总是)由编译器生成#34;。

如果要遵循这个逻辑,那么构造函数是否为"默认"或不依赖于如何调用它。即如果你可以称之为"默认"方式,没有任何参数,它是一个默认的构造函数。

然而,MSDN,如果我正确地阅读它,似乎给出了名称"默认构造函数"只有在没有指定其他构造函数时隐式生成的无参数构造函数,调用无参数的基类构造函数,并且(像任何其他构造函数一样)初始化class的字段他们的价值观。

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

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

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

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

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

1 个答案:

答案 0 :(得分:9)

不仅仅是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规范中的这一陈述:

  

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

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

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

public class Derived : Base
{
}

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

下一步:

  

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

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