2012-09-19 27 views
2

不知道這是一個有點多餘的問題,但考慮到我有以下方法:調用帶有空過載:鑄造VS默認

void Foo(SomeClass x) 
{ 
    //Some code 
} 

void Foo(AnotherClass x) 
{ 
    //Some code 
} 

而且我們說,我想打電話給一個特定的過載( SomeClass之一)與空,這裏是我的選擇:

Foo((SomeClass)null) 

Foo(null as SomeClass) 

Foo(default(SomeClass)) 

基本上,這是最好的去?不同方法之間是否存在顯着的性能差異?一般認爲具體方式比其他方式更「優雅」嗎?

感謝

+1

它不會使語義差別(我不知道什麼IL差別有,如果有的話,雖然..)。始終如一。我總是使用前者,因爲我喜歡C#中的「預先輸入」。 – 2012-09-19 00:50:43

+0

我想你可能需要重新評估你想在這裏做什麼。 – Kittoes0124

+0

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 –

回答

5

方案4:創建另一個超載:

void Foo() 

與您需要轉換的顯式空調用?嗯... ... EWW

爲 「正式」 回答你的問題。嘗試一下!

var sw = Stopwatch.StartNew(); 
for (int i = 0; i < 1000000; i++) { 
    Foo(null as string); 
} 
Console.WriteLine(sw.ElapsedMilliseconds); 

sw = Stopwatch.StartNew(); 
for (int i = 0; i < 1000000; i++) { 
    Foo((string)null); 
}   
Console.WriteLine(sw.ElapsedMilliseconds); 

sw = Stopwatch.StartNew(); 
for (int i = 0; i < 1000000; i++) { 
    Foo(default(string)); 
} 
Console.WriteLine(sw.ElapsedMilliseconds); 

Console.ReadLine(); 

我對所有3種方法都達到了〜4ms。

當我打開了在反射器的程序,我看到所有的呼叫已變成:Foo((string) null);

所以,你可以選擇任何你找到最可讀的。 IL所有結果完全一樣。

+0

不幸的是我的情況下,過載富()已經存在,它與另一種「默認」非空值調用foo(SomeClass的X)。奇怪的做法,我知道,但它的舊代碼,我在這裏工作的一部分:P感謝您的性能故障,貌似我會明​​確的投一致性去,因爲它是用來在其他地方已經:) –