【问题标题】:What does the default constructor do? [duplicate]默认构造函数是做什么的? [复制]
【发布时间】:2019-01-16 10:19:35
【问题描述】:

在下面的代码中,谁为变量a 赋值?为什么在我没有在代码中写任何关于它的内容时创建默认构造函数(我检查了创建默认构造函数的地方的 ildasm)

创建的默认构造函数中的内容:

method public hidebysig specialname rtspecialname 
    instance void  .ctor() cil managed
{
// Code size       8 (0x8)
.maxstack  8
IL_0000:  ldarg.0
IL_0001:  call       instance void [System.Runtime]System.Object::.ctor()
IL_0006:  nop
IL_0007:  ret
} // end of method Program::.ctor

代码:

using System;
namespace demo
{
    class Program
    {
        int a;
        static void Main(string[] args)
        {
            Program obj = new Program();
            Console.WriteLine(obj.a);
            Console.ReadLine();
        }
    }
}

在上面的代码中输出为0,谁给它赋值?是创建了默认构造函数还是 CLR?

instance void [System.Runtime]System.Object::.ctor()默认构造函数的ildasm代码中这是什么意思

【问题讨论】:

  • 尝试在字段初始化器中初始化a,比如int a = 8;,看看有什么区别。
  • @kennyzx 我尝试了相同的int a=8 然后创建的默认构造函数已将值 8 分配给 a
  • 没有构造函数,就无法创建对象。这就是为您添加默认构造函数的原因。由于如果您忘记提供构造函数,编译器实际上有两个选项。 a) 为您提供一个。 b)不编译(并强制您手动添加一个进行编译)。 C# 选择了选项 a)。
  • so 在 ildasm 中包含对 System.Object::.ctor() 的调用是用于对象创建的 system.Object 类的构造函数。 @mjwills

标签: c# constructor


【解决方案1】:

基础知识。全部在文档中——而且很早。

上面代码中输出为0,是谁给它赋值的?

.NET 中的变量全部初始化为 0,以避免重用之前使用内存地址的内存碎片。

为什么我在代码中没有写任何关于它的东西时会创建一个默认构造函数

因为它是一个 DEFAULT 构造函数,因为(!)您没有指定构造函数。也许对“默认”一词有混淆?如果所有对象都有构造函数,它会更容易,特别是如果我将你的对象子类化然后调用它;)

【讨论】:

  • It makes it easier if all objects have constructors 在这里使用“更简单”是一个奇怪的术语——因为没有 any 构造函数的(非静态)类并不难,它会毫无用处。 :)
  • 除了 CAN 子类程序 - 它不是静态类 - 并且子类默认调用父构造函数。然后你可以在那里添加代码而不会产生问题。
  • 你可以这样做,是的,但前提是基类有一个构造函数(即它并没有使它变得更容易,它使它可能)。我并不反对你——只是说使用easier 这个词很奇怪。
  • 感谢@TomTom 的澄清
猜你喜欢
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多