2012-11-08 9 views
6

Unten ist ein kurzer Code, um meine Frage zu veranschaulichen. Irgendeine Möglichkeit, dieses scheinbar unnötige Boxen/Unboxing zu vermeiden?Vermeiden Sie Boxen & Unboxing in der generischen Klasse

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 bedeuten "derselbe Code funktioniert für mehrere Typen". Sie möchten einen unterschiedlichen Code für verschiedene Typen, sodass Ihr Anwendungsfall außerhalb des Fokus von Generika liegt. – dtb

+3

Wenn Sie nur den Typ im Körper der Methode überprüfen, warum es überhaupt generisch machen? – Servy

+0

Kann die .NET-Laufzeitumgebung das nicht optimieren? –

Antwort

4

Dies ist der einzige Weg zu handhaben, was Sie hier tun (eine nicht Standardwert für eine bestimmte geschlossen generische Art Rückkehr).

+0

Dies ist, was ich dachte, da T nicht zur Kompilierzeit bekannt ist, aber ich dachte, ich würde es versuchen. :) –

0

Machen Sie es zu einem statischen Feld.

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

    public T TestMethod() 
    { 
    return TrueIfBoolean; 
    } 
} 

Auf diese Weise passiert das Boxen/Unboxing nur einmal. Es ist auch durchaus möglich, dass diese Art der Optimierung ohnehin schon in Ihrem ursprünglichen Code durch die Laufzeit erfolgt.

+0

Ich glaube nicht, dass der Compiler eine Umwandlung von einem Werttyp in "Objekt" optimieren kann. Auf der anderen Seite, wenn die Besetzung nur einmal passiert, wird die verschwendete Zeit ein Nicht-Faktor sein. – supercat