如果它是默认构造函数,谁将成员变量初始化为零,那么为什么会这样呢
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();
}
}
答案 0 :(得分:19)
因为字段初始化程序在构造函数之前运行。您没有在构造函数中指定j
值,默认情况下它为0
,因为它是int
。
字段的初始值,无论是静态字段还是静态字段 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
,但j
将0
作为default
值,因为它尚未被分配到任何位置构造函数。
答案 6 :(得分:-1)
如果您的程序中没有prog定义的构造函数,则系统将在编译时创建一个默认构造函数,称为“系统定义的默认构造函数”。
系统定义的默认构造函数-将默认值分配给您的类的数据成员。
您可以签出->不要在类中定义任何构造函数并编译Java程序。编译后,键入命令 javap className 并按Enter键。 您将在类定义中找到默认的构造函数,并且在编译器提供的主体部分中没有任何语句。