2010-07-08 58 views

回答

36
int xyz = 0; 

爲什麼讓人們覺得超過必要? default對於泛型代碼非常有用,但在這裏它不會添加任何內容。你也應該考慮如果你在正確的地方初始化它,並且有一個有意義的價值。有時你會看到堆棧變量的代碼如下:

int xyz = 0; 

if(someCondition) 
{ 
    // ... 
    xyz = 1; 
    // ... 
} 
else 
{ 
    // ... 
    xyz = 2; 
    // ... 
} 

在這種情況下,您應該延遲初始化,直到您具有實際值。請執行以下操作:

int xyz; 

if(someCondition) 
{ 
    // ... 
    xyz = 1; 
    // ... 
} 
else 
{ 
    // ... 
    xyz = 2; 
    // ... 
} 

編譯器確保您不使用未初始化的堆棧變量。在某些情況下,你必須使用無意義的值,因爲編譯器無法知道代碼永遠不會執行(由於異常,調用Exit等)。這是規則的例外(不是雙關語)。

+2

+1爲什麼讓人們覺得超過必要? – Salil 2010-07-08 06:16:57

+2

思考超過必要:xyz = 0意味着x = 0或y = 0或z = 0(有時候?) – TNi 2010-07-08 06:19:12

+2

我完全同意馬修。但是對於他(簡單的)局部變量初始化的例子,我更喜歡 「int x = someCondition?1:2;」 ,因爲它更緊湊,清楚地表明它是一個單值賦值。 只要有可能,局部變量應該在使用前直接創建。 – rotti2 2010-07-08 07:52:08

5

你的代碼沒有性能差異。清楚地看到使用int xyz = 0;

+2

性能不是唯一的重要指標。 – Incognito 2010-07-08 07:15:08

9

default運算符的用途是爲您提供類型的默認值,但主要是爲了讓泛型對於聲明爲泛型類型參數的值具有有效值而添加的。

我沒有確鑿的證據,但我懷疑編譯器會針對您的具體情況發出相同的代碼。

然而,這裏有一個合法使用的default

public T Aggregate<T>(IEnumerable<T> collection, Func<T, T, T> aggregation) 
{ 
    T result = default(T); 

    foreach (T element in collection) 
     result = aggregation(result, element); 

    return result; 
} 

沒有default,上面的代碼將需要一些黑客爲了正確地編譯和功能。

因此,使用第一個,將其設置爲0

2

int xyz = default(int); 我喜歡這種方式時使用泛型bcoz它讓您靈活地獲得默認的任何類型,你正在與。

int xyz = 0;另一方面,這很容易和快速,顯然在通用情況下不起作用。

兩者都有自己的優點和缺點..

問候,

14

這取決於你想要達到的目標。

我寧願

int xyz = 0; 

,因爲我相信它是更具可讀性,而不是混亂。

default關鍵字大多適用於泛型。

3

鑑於發出CIL是相同的(你

IL_0001: ldc.i4.0 
    IL_0002: stloc.0 
在這兩種情況下

),規則是要選擇你感覺更好通信代碼的意圖之一。通常,感覺問題是主觀的,難以確定;然而,在這種情況下,我是代碼審查人員,我將不得不提出一個非常有吸引力的理由來接受看起來完全是多餘的使用default()

0

INT XYZ = 0是moreclear,defaut通常與泛型

0

最好使用是

int xyz; 

因爲你不能訪問到未初始化的變量。

相關問題