2014-03-25 37 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,然後將該值複製到最終目標。但是請注意,在某些情況下,編譯器和運行時可以確定可以省略複製步驟,而不會在程序中引入語義更改。