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

薄荷糖97

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

如果要遵循此逻辑,则构造函数是否为“默认”取决于您如何调用它。即,如果您可以将其称为“默认”方式,而无需任何参数,则它是默认构造函数。

但是,如果我正确阅读的话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规范中的以下语句:

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

不一定是这样。即使Base没有无参数构造函数,该代码也可以正常编译

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

public class Derived : Base
{
}

谈论默认构造函数来调用基类构造函数,就好像存在显式调用一样base(),并进行正常的重载解析等过程,这样会更准确

下一个:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

我可以在外部构造函数中为参数类型构建无参数构造函数吗?

来自分类Dev

我们可以将函数作为参数传递吗

来自分类Dev

为什么将默认参数构造函数称为默认构造函数

来自分类Dev

什么时候将构造函数称为默认构造函数?

来自分类Dev

我们可以强制ac#编译器首先运行构造函数吗?

来自分类Dev

我们可以说构造函数创建对象吗?

来自分类Dev

我们可以继承Java中的基类构造函数吗

来自分类Dev

我们可以在构造函数内部初始化静态变量吗?

来自分类Dev

Java-我们可以在构造函数中声明对象变量吗?

来自分类Dev

我们可以在反应中使用其他名称调用构造函数(props)吗?

来自分类Dev

我们可以说非静态块作为类的构造函数吗?

来自分类Dev

我们可以强制ac#编译器首先运行构造函数吗?

来自分类Dev

我们可以在构造函数中定义静态类成员吗?

来自分类Dev

我们可以使用尾随返回类型语法编写构造函数/析构函数吗?

来自分类Dev

默认的默认构造函数可以抛出吗?

来自分类Dev

可以同时使用默认构造函数和参数构造函数吗?

来自分类Dev

即使我们有构造函数,如何将变量初始化为默认值

来自分类Dev

构造函数默认参数

来自分类Dev

是否可以从派生类的默认构造函数将参数传递给基本构造函数?

来自分类Dev

是否可以从派生类的默认构造函数将参数传递给基本构造函数?

来自分类Dev

在Hindley Milner类型系统中,我们可以在构造函数位置使用类型变量吗?

来自分类Dev

我们可以在另一个类的构造函数的帮助下初始化对象吗?

来自分类Dev

我们可以在另一个类的构造函数的帮助下初始化对象吗?

来自分类Dev

在Hindley Milner类型系统中,我们可以在构造函数位置使用类型变量吗?

来自分类Dev

构造函数和无参数构造函数?

来自分类Dev

我可以将函数的参数称为标识符吗?

来自分类Dev

我可以在Fragments构造函数中放入参数吗

来自分类Dev

我应该定义默认的构造函数吗?

Related 相关文章

  1. 1

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

  2. 2

    我可以在外部构造函数中为参数类型构建无参数构造函数吗?

  3. 3

    我们可以将函数作为参数传递吗

  4. 4

    为什么将默认参数构造函数称为默认构造函数

  5. 5

    什么时候将构造函数称为默认构造函数?

  6. 6

    我们可以强制ac#编译器首先运行构造函数吗?

  7. 7

    我们可以说构造函数创建对象吗?

  8. 8

    我们可以继承Java中的基类构造函数吗

  9. 9

    我们可以在构造函数内部初始化静态变量吗?

  10. 10

    Java-我们可以在构造函数中声明对象变量吗?

  11. 11

    我们可以在反应中使用其他名称调用构造函数(props)吗?

  12. 12

    我们可以说非静态块作为类的构造函数吗?

  13. 13

    我们可以强制ac#编译器首先运行构造函数吗?

  14. 14

    我们可以在构造函数中定义静态类成员吗?

  15. 15

    我们可以使用尾随返回类型语法编写构造函数/析构函数吗?

  16. 16

    默认的默认构造函数可以抛出吗?

  17. 17

    可以同时使用默认构造函数和参数构造函数吗?

  18. 18

    即使我们有构造函数,如何将变量初始化为默认值

  19. 19

    构造函数默认参数

  20. 20

    是否可以从派生类的默认构造函数将参数传递给基本构造函数?

  21. 21

    是否可以从派生类的默认构造函数将参数传递给基本构造函数?

  22. 22

    在Hindley Milner类型系统中,我们可以在构造函数位置使用类型变量吗?

  23. 23

    我们可以在另一个类的构造函数的帮助下初始化对象吗?

  24. 24

    我们可以在另一个类的构造函数的帮助下初始化对象吗?

  25. 25

    在Hindley Milner类型系统中,我们可以在构造函数位置使用类型变量吗?

  26. 26

    构造函数和无参数构造函数?

  27. 27

    我可以将函数的参数称为标识符吗?

  28. 28

    我可以在Fragments构造函数中放入参数吗

  29. 29

    我应该定义默认的构造函数吗?

热门标签

归档