2012-11-08 34 views
6

下面是一些快速代碼來說明我的問題。任何方式來避免這種顯然不必要的拳擊/拆箱?避免拳擊與拆箱在通用類

public class TestClass<T> 
{ 
    public T TestMethod() 
    { 
    if (typeof(T) == typeof(bool)) 
    { 
     return true; // doesn't work 
     return (T)(object)true; // works, but any way to avoid this? 
    } 

    return default(T); 
    } 
} 
+3

泛型意味着「相同的代碼適用於多種類型」。您需要針對不同類型的不同代碼,因此您的用例不在泛型的關注範圍之內。 – dtb

+3

如果你只是在方法的主體中檢查類型,爲什麼首先使它通用? – Servy

+0

.NET運行庫不會優化嗎? –

回答

4

這是處理你在做什麼,在這裏的唯一方法(返回爲特定的非默認值關閉通用型)。

+0

這就是我想既然T沒有在編譯時已知,但我想我會嘗試。 :) –

0

使它成爲一個靜態字段。

public class TestClass<T> 
{ 
    static T TrueIfBoolean = typeof(T) == typeof(bool) ? (T)(object)true : default(T) 

    public T TestMethod() 
    { 
    return TrueIfBoolean; 
    } 
} 

這樣,拳擊/拆箱只發生一次。即使在你的初始代碼中,這種優化也完全可能由運行時完成。

+0

我不認爲編譯器可以優化從一個值類型轉換爲'object'。另一方面,如果演員只發生一次,浪費的時間將成爲一個非因素。 – supercat