Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 谁将初始化数据成员?它是构造器还是什么?_C# - Fatal编程技术网

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();
}