2011-07-13 107 views
3

我正在創建一個整數,我想在處理之前用0來實例化它。int i = 0和int i = default(int)之間是否存在性能差異?

我寫首先

int i = default(int); 

然後我刪除它與另一種是

int i = 0; 

我想知道我的選擇是在小型微型表現最好更換。 在編譯時default()函數是否會增加指令?

+2

所以'詮釋我'應該表現更好?我相信這樣的問題甚至不值得提問;這對我來說聽起來像是對語言編譯器的侮辱 – driushkin

+1

並且超越微優化總是存在納米優化... –

回答

9

不,它們在編譯時解析併產生相同的IL。值類型將爲0(或false,如果您有bool,但仍爲0),並且引用類型爲null

+0

這是正確的嗎?如果我有一個通用的方法,如'public T GetDefault (){return default(T); }' - 編譯時無法解析。事實上,我可以將它用於尚不存在的類型。無論如何,真正的答案是 - 如果這個愚蠢的小改變對你有所幫助,C#可能無法滿足你的需求。 – Kobi

+2

這可以在編譯時解決,因爲'T'將被知道/推斷。 –

+1

@George - 這不是一個有趣的案例。如果你使用'GetDefault'作爲編譯程序集的一部分呢?在這種情況下,'default(T)'不會再次編譯或優化(OK,它是通過JIT,但這是另一個問題) – Kobi

3

馬龍的答案在技術上是正確的,但每個選項之間應該有明確的語義差異。

int i = 0; 

初始化字面零使得語義感覺,當你想要做的整數數學運算,並將該操作需要開始與變量是零的特定值。一個很好的例子是創建一個索引計數器變量;你想從零開始計數。

int i = default(int); 

一個變量設置爲它的default價值是有道理的,當你,例如,創建一個類與所述變量,你知道的變量將在這個過程中手動設置以後。下面是一個例子(但不實用的可能):

class IntegerClass 
{ 
    private int value; 

    public IntegerClass(int value) 
    { 
     this.value = value; 
    } 

    public void Reset() 
    { 
     this.value = default(int); 
    } 
} 

同樣,他們在技術上相等(並且實際上將編譯到相同CIL),但每種方法提供不同的語義。

此外,在使用泛型時,可能需要使用default來初始化變量。

public T SomeOperation<T>() 
{ 
    T value = default(T); 

    this.SomeOtherOperation(ref value); 

    return T; 
} 
1

唯一真正的區別在於它將使就是編譯時間,所以我想,當你按下調試它會比其他毫毫毫毫秒快的一種方式或編譯,但作爲編譯完成後,它與Marlon所說的完全一樣

這些小的改動只會影響你的實際編程時間,所以在更廣泛的意義上,寫出默認值(int)比寫入0要慢,你花費更多的時間思考它。

相關問題