C# 谁将初始化数据成员?它是构造器还是什么?
如果它是默认构造函数,谁会将成员变量初始化为零,那么这怎么可能呢C# 谁将初始化数据成员?它是构造器还是什么?,c#,C#,如果它是默认构造函数,谁会将成员变量初始化为零,那么这怎么可能呢 class A { public int i; public int j; public A() { i=12; } } class Program { static void Main(str
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();
}
}
答案在于c#数字字段默认为0。在C++中,int字段是默认值的一个随机值,因为字段初始化器在构造函数之前运行。您没有在构造函数中指定
j
值,因为它是int
,所以默认值为0
从
字段的初始值,无论是静态字段还是静态字段
实例字段,是该字段的
类型
是谁干的?嗯,当你调用
new
时,看起来就是这样。查看更多详细信息。在实例创建过程中,其变量也可用。
由于int不可为null,因此它使用默认值(int)初始化。将默认值int
设置为0
。有关找到的默认值的详细信息
更进一步,因为它们是这个领域
字段的初始值(无论是静态字段还是实例字段)是默认值
默认构造函数将
i
分配给12
,但j
将0
作为默认值,因为它在构造函数中的任何位置都没有分配 字段初始化发生在通过newobj
命令调用构造函数之前。使用以下C#代码反编译可执行文件后,很容易进行检查:
反编译MSIL代码的一部分(方法main):
我们可以看到,MSIL使用newobj
指令创建类的实例。根据以下规定:
newobj指令分配关联类的新实例
使用ctor并将新实例中的所有字段初始化为0
适当的类型)或空引用。然后它调用
具有给定参数和新创建的
例如。调用构造函数后,现在初始化
对象引用(类型O)被推送到堆栈上
如果错误,请进行注释,否则请将其指定为正确答案。在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();
}
我希望这有帮助 如果您的程序中没有prog定义的构造函数,则系统将在编译期间创建一个默认构造函数,称为“系统定义的默认构造函数”。
系统定义的默认构造函数-将默认值分配给类的数据成员
您可以签出-->不要在类中定义任何构造函数并编译java程序。编译后,键入命令javap className,然后按Enter键。
您会发现您的类定义中有默认构造函数,但编译器提供的主体部分中没有任何语句。如果我们声明的默认构造函数将在声明为A=new A()时执行,那么在上面的上下文中,j如何初始化为零代码>要点:)我稍后会更新消息(目前正在培训中)@Downvoter care至少要发表评论,这样我就可以知道我可能错在哪里了?我想OP已经知道了,并询问初始化发生在哪里。@Selman22“where”是什么意思?C#被编译成MSIL代码,然后,编译后,它将是smth,如下public int j=0代码>@dyatchenko我已经检查了生成的IL代码。没有将j初始化为0的代码。区分初始归零和字段初始化器何时运行很重要。我认为在调用newobj
指令之前,内存实际上已经归零了newobj
总是抓取gen0堆中下一个未使用的部分,并且保证gen0堆中未使用的部分总是归零(当内存来自操作系统时归零,当垃圾收集过程发生并且压缩将使用的内存变回未使用的内存时,可以再次归零)恐怕这是另一个问题的核心。
public A ()
{
i=12;
}
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();
}