谁将初始化数据成员?它是构造函数还是任何东西?

时间:2015-02-20 09:04:25

标签: c#

如果它是默认构造函数,谁将成员变量初始化为零,那么为什么会这样呢

class A        
{        
    public int i;        
    public int j;        
    public A()        
    {        
       i=12;        
    }        
}        
class Program        
{        
     static void Main(string[] args)        
     {        
         A a = new A();        
         Console.WriteLine(a.i + "" + a.j);        
         Console.ReadLine();          
     }        
}

7 个答案:

答案 0 :(得分:19)

因为字段初始化程序在构造函数之前运行。您没有在构造函数中指定j值,默认情况下它为0,因为它是int

来自10.4.4 Field initialization

  

字段的初始值,无论是静态字段还是静态字段   instance field,是字段的默认值(Section 5.2)   类型。

谁这样做?好吧,当您致电new时,newobj看起来就是这样。请查看dyatchenkos' answer了解更多详情。

答案 1 :(得分:11)

字段初始化发生在构造函数通过newobj命令调用之前。使用以下C#代码反编译可执行文件后很容易检查:

using System;
namespace ConsoleApplication1
{
    public class A { public int j; }

    class Program
    {
        static void Main(string[] args)
        {
            A g = new A();
            Console.WriteLine(g.j);
        }
    }
}

部分已解密的MSIL代码(方法main):

//000017:         {
    IL_0000:  nop
//000018:             A g = new A();
    IL_0001:  newobj     instance void ConsoleApplication1.A::.ctor()
    IL_0006:  stloc.0
//000019:             Console.WriteLine(g.j);
    IL_0007:  ldloc.0
    IL_0008:  ldfld      int32 ConsoleApplication1.A::j
    IL_000d:  call       void [mscorlib]System.Console::WriteLine(int32)
    IL_0012:  nop
//000020:         }

正如我们所看到的,MSIL使用newobj指令来创建A类的实例。根据以下microsoft acticle

  

newobj指令分配关联类的新实例   使用ctor并将新实例中的所有字段初始化为0 (   适当的类型)或适当的空引用。然后它调用   具有给定参数的构造函数ctor以及新创建的   实例。调用构造函数后,现在已初始化   对象引用(类型O)被压入堆栈。

如果错误,请发表评论,否则请将其指定为正确答案。

答案 2 :(得分:2)

在C#中,int变量将始终默认为0,除非另有说明。在你的构造函数中:

public A ()
{
    i=12;
}

实例化对象后,i属性将初始化为12,而j属性将初始化为0.

在您的代码中:

public class Program
{
    A a = new A(); // You instantiated your object, i will be assigned 12
    Console.WriteLine(a.i.ToString() + "" + a.j.ToString()); 
    // Your output will be 12 0 because you didn't initialize j so the default is 0
    Console.ReadLine();
}

我希望这有帮助!

答案 3 :(得分:1)

答案在于c#数字字段默认为0。在C ++中,int字段默认是一些随机值

答案 4 :(得分:1)

在实例创建期间,其变量也可用。 由于int不可为空,因此使用default(int)初始化。哪个是0

答案 5 :(得分:1)

C#将默认int设置为0。有关here

的默认值的更多信息

还有更多,因为它们是字段apply

  

字段的初始值,无论是静态字段还是实例字段,都是默认值。

默认构造函数会将i分配给12,但j0作为default值,因为它尚未被分配到任何位置构造函数。

答案 6 :(得分:-1)

如果您的程序中没有prog定义的构造函数,则系统将在编译时创建一个默认构造函数,称为“系统定义的默认构造函数”。

系统定义的默认构造函数-将默认值分配给您的类的数据成员。

您可以签出->不要在类中定义任何构造函数并编译Java程序。编译后,键入命令 javap className 并按Enter键。 您将在类定义中找到默认的构造函数,并且在编译器提供的主体部分中没有任何语句。