2012-11-08 20 views
6

Poniżej znajduje się krótki kod ilustrujący moje pytanie. Jakikolwiek sposób uniknąć tego pozornie niepotrzebnego boksowania/rozpakowywania?Unikaj boksowania i rozpakowywania w klasie ogólnej

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

Generics oznacza "ten sam kod działa dla wielu typów". Chcesz różnych kodów dla różnych typów, więc twój przypadek użycia nie jest przedmiotem ogólnej wiedzy. – dtb

+3

Jeśli chcesz tylko sprawdzić typ w treści metody, dlaczego chcesz go generować? – Servy

+0

Czy środowisko wykonawcze .NET nie optymalizuje tego? –

Odpowiedz

4

Jest to jedyny sposób, aby poradzić sobie z tym, co tu robisz (zwracając wartość inną niż domyślna dla określonego zamkniętego typu ogólnego).

+0

Tak właśnie się domyślałem, ponieważ T nie jest znany podczas kompilacji, ale myślałem, że spróbuję. :) –

0

Stwórz pole statyczne.

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

    public T TestMethod() 
    { 
    return TrueIfBoolean; 
    } 
} 

W ten sposób boks/odpakowanie następuje tylko raz. Jest też całkiem możliwe, że tego rodzaju optymalizacja jest wykonywana przez środowisko wykonawcze, nawet w początkowym kodzie.

+0

Nie sądzę, że kompilator może zoptymalizować rzutowanie z typu wartości na "obiekt". Z drugiej strony, jeśli rzucanie ma miejsce tylko raz, stracony czas nie będzie czynnikiem. – supercat

Powiązane problemy