2016-06-23 65 views
1

這些聲明之間是否有區別?c#這些聲明1- class objClass之間是否有區別;和2級objClass = null

Animal animal; 
Animal animal1 = null; 
+2

是的。首先你期望編譯器將對象設置爲其默認值,而在第二個對象中,你明確地將它的值設置爲null,這對於第一個對象來說總是比較安全的方法。 – Baahubali

+5

https://msdn.microsoft.com/en-us/library/edakx9da.aspx。總之,如果您在分配變量之前嘗試訪問該變量,則第一種形式將生成編譯器錯誤,第二種形式會生成運行時錯誤。 – Claies

+1

那些局部變量聲明或字段聲明? –

回答

4

沒有,沒有任何顯著差異。最後,在運行時,您將有一個名爲animal的變量,其類型爲Animal,定義時其值爲null,稍後您將邏輯上將其值設置爲非null值,以便使用它。

但是,有些人會選擇第一個而不是第二個聲明,反之亦然。此外,有人會認爲第二種情況下的null的分配是多餘的。例如,如果您使用ReSharper,我認爲您會注意到關於設置那裏的冗餘的消息null

最後但並非最不重要的我想你定義了一個類型爲Animal的變量,後來嘗試設置它的值(我指的是第一種情況)。如果是這樣,你處於一個良好的狀態。否則,如果你有下面的代碼片段:

Animal animal; 
if(animal==null) 
{ 

} 

你可以得到的資料彙編和下面的描述編譯錯誤之前警告:

使用未分配的局部變量「動物」

如果您只聲明瞭變量並且您從未使用過變量,則會收到以下說明的警告:

變量「動物」聲明,但從未使用

所有上述指局部變量的情況下,如果我們是在一個類變量的情況下,那麼事情有點不同。如果創建一個控制檯應用程序,你有下面的代碼片段:

class Program 
{ 
    static Animal animal; 

    static void Main(string[] args) 
    { 
     if(animal==null) 
     { 

     } 
    } 
} 

得到任何編譯錯誤。你將只能得到一個警告,在下面的描述:

Field 'Program.animal' is never assigned to, and will always have its default value null 
+1

正如上面Claies指出的那樣,你明確地在第二種形式中指定一個空值的事實會使編譯器認爲你打算這樣做,因此如果你在分配一個值之前嘗試使用它,它不會將它看作是一個錯誤。 –

+0

@DrunkenCodeMonkey我會在我的帖子中加上這個,謝謝 – Christos

+0

很好的解釋。 – Rajdeep

6

有根據基於該contextC#規格的差異。在method的上下文中,編譯器可以證明第一個animal未分配,因此可以在使用它的下一行生成編譯器錯誤。如果編譯器可以證明沒有分配,C#編譯器將不允許使用方法變量。

然而,如果animal類字段它將自動初始化爲默認值,並且編譯器將不會產生錯誤。

下面是C#規格:

5.3明確分配

在函數構件的可執行代碼的給定位置,一 可變據說如果編譯器被明確賦值可以通過特定的靜態流量分析(§5.3.3)證明, ,該變量具有 已被自動初始化或已成爲至少一個 分配的目標。

因此,對於第一個,編譯器會生成一個"Use of an unassigned local variable"。雖然第二,你明確地分配變量爲null,所以編譯器應該沒問題。

+0

這應該被接受。 – niksofteng

相關問題