2014-03-25 31 views
1

见我下面是сonstructor初始化值还是CLR?

我的问题的代码是:我没有初始化的eIdeName的默认值,但仍向属性初始化为默认值。

CLR是否这样做?

class Employee 
{ 
    int _empId; 
    String _eName; 
    public Employee() 
    { 
     // I am not initializing the attributes here 
    } 
    public void Disp() 
    { 
     Console.WriteLine("Id:: {0} Name:: {1}", _empId, _eName); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Employee().Disp(); 
    } 
} 

回答

5

在.NET中的所有值和对象有默认值。如果您未指定明确的值,则将使用默认值。

  • 对于对象,默认值是null
  • 对于值类型,在default value is 0(或东西,相当于0,像Guid.Emtpy

既然你不初始化值的字段,他们得到默认值。

+0

我同意你的看法,但我需要知道在创建内存时,CLR是否正在进行初始化? – Uthaiah

+2

它在创建变量时执行。在这种情况下,它们是字段,所以它们在创建对象时被初始化。 –

+0

我的下一个问题是..如果CLR在创建对象时默认执行它......编译器创建默认构造函数和初始化值的用途是什么? – Uthaiah

0

在类定义中设置的类成员变量在具有默认值的构造函数之前设置。如果你愿意,你可以轻松地重置构造函数中的默认值。构造函数对于类是强制性的。如果您没有为类创建任何构造函数,编译器将自动创建无参数构造函数。自动创建的构造函数不会初始化类成员变量。

.NET有两种数据类型(值类型和引用类型)。这两种数据类型在内部有其自己的默认值。 (大多数引用类型的默认值为null)。在你的程序中你已经使用了int和string数据类型。 Int的默认值为'0',字符串的默认值为'Null'。如果你没有初始化变量,它会自动采用默认值并处理它。

为值数据类型的默认值:Default Values Table

+0

我已经明确地写了一个构造函数来初始化值,,,但不幸的是我没有分配任何东西....现在谁在初始化默认值...?创建内存时是CLR? – Uthaiah

+0

被在类定义中设置类成员变量具有默认值的构造之前被设置。如果你愿意,你可以轻松地重置构造函数中的默认值。我忘记在我的回答中提到这一点。我现在更新了它。 “ – petchirajan

+0

”在类定义中设置的类成员变量在具有默认值的构造函数之前设置。“ 那么为什么编译器生成一个默认的构造函数来分配值,如果CLR正在做? – Uthaiah

4

我没有初始化的eIdeName的默认值,但仍然得到字段初始化为默认值。 CLR是这样做的吗?

是的。

对于类,内存分配器在执行构造函数之前将内存清零。

对于结构体,运行时会从短暂存储中分配一个空白结构体,将构造函数的引用传递给临时变量this,然后将该值复制到最终目标。但是请注意,在某些情况下,编译器和运行时可以确定可以省略复制步骤,而不会在程序中引入语义更改。