【问题标题】:why Int32's default constructor is parameterless?为什么 Int32 的默认构造函数是无参数的?
【发布时间】:2018-03-21 14:37:28
【问题描述】:
int x = 6;

它有效,但是

Int32 x = new Int32(6);

没有。 为什么 Int32 的默认构造函数是无参数的? 它如何将 6 分配给 x?

编辑: 更多解释.. https://referencesource.microsoft.com/#mscorlib/system/int32.cs,225942ed7b7a3252第38行:

internal int m_value;

编译器如何为这个 m_value 赋值 6? Int32 的构造函数是无参数的。

【问题讨论】:

  • 它由编译器完成。这就是引擎盖的魔法,仅此而已
  • 我认为System.Int32 甚至没有无参数构造函数。
  • @TimSchmelter - 所有结构都有一个默认构造函数。
  • @TimSchmelter all 结构具有无参数构造函数。当然你可以自己编译代码自己看,而不是相信网上的陌生人。
  • @Servy:这可能是编译器的魔力,让你相信有一个,而实际上没有

标签: c# constructor int internals int32


【解决方案1】:

它如何将 6 分配给x

6,文字,已经是一个整数。该语言的设计方式是在语法中存在 文字表达式,这些表达式由编译器直接解释。

普通的6 是一个整数文字,已经对应一个值为6 的Int32 对象。编译器实际上不需要为文字调用构造函数,而是可以直接创建对象。根据类型的不同,不同的文字可能有不同的语法。例如,字符串文字"foo" 也会让编译器直接创建一个值为 “foo” 的字符串对象。

请注意,这对于 C# 及其类型系统来说并没有什么特别之处。所以Int32 是否是一个值类型实际上并不重要(String 甚至不是一个值类型,仍然存在文字)。

【讨论】:

  • 可以添加一个有趣的事实:“已经对应于值为 6 的 Int32 对象”并不完全正确。在那一刻,内存中没有任何“对象”或结构。方法帧内正好有 4 个字节,将从进程内存中复制 4 个字节(值为 6)。
【解决方案2】:
x = 6;

编译后变成:

IL_0001: ldc.i4.6     
IL_0002: stloc.0      

如您所见,.NET 有从文字创建整数值的指令。它是在引擎盖下完成的。

ldc.i4.6 创建“6”并将其放在堆栈顶部。 (实际上是创建整数值)

stloc.0 将栈顶的值复制到变量 x 中

【讨论】:

  • 感谢我的输出。这是否意味着当我们编写 Int32 x = new Int32(); 时编译器不使用 Int32 结构? ?
  • @csharpnewbie: 编译成ldc.i4.0 ; stloc.0,所以没有。您可以使用 LINQPad 自己验证这些事情;它可以选择直接输出编译后的 IL。
  • @csharpnewbie 编译器在创建过程中不使用 Int32 中的任何内容,但创建后它完全是 Int32 结构 - 它具有方法、字段等
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多