2009-03-26 20 views
16

Ein statisches Feld in einer generischen Klasse hat einen separaten Wert für jede Kombination generischer Parameter. Es kann daher als ein Wörterbuch < Typ verwendet werden, was >Statische generische Klasse als Dictionary

Ist das besser oder schlechter als ein statisches Wörterbuch < Typ, was >?

Mit anderen Worten, welche dieser Implementierungen ist effizienter?

public static class MethodGen<TParam> { 
    public static readonly Action<TParam> Method = CreateMethod(); 
    static Action<TParam> CreateMethod() { /*...*/ } 
} 

Oder

public static class MethodGen { 
    static readonly Dictionary<Type, Delegate> methods 
       = new Dictionary<Type, Delegate>(); 

    public static Action<T> GetMethod<T>() { 
     //In production code, this would ReaderWriterLock 

     Delegate method; 
     if(!methods.TryGetValue(typeof(T), out method) 
      methods.Add(typeof(t), method = CreateMethod<T>()); 
     return method; 
    } 

    static Action<T> CreateMethod<T>() { /*...*/ } 
} 

Insbesondere wie funktioniert die CLR-Lookup die statischen Felder von generischen Typparameter?

+0

Wie implementieren Sie Ihre statische Aktion CreateMethod ()? –

+0

Und gerade als ich darüber nachdachte! +1 – nawfal

Antwort

12

Ich verwende gerne generische Typen auf diese Weise. Insbesondere habe ich oft private verschachtelte generische Klassen für genau diesen Zweck.

Die Hauptsache, die ich daran mag, ist, dass es schwer nicht ist, um die Initialisierung auf diese Weise (in Bezug auf Thread-Sicherheit) zu erhalten, gegeben die Art Initialisierung Typ funktioniert. Das einzige Problem ist, was zu tun ist, wenn die Initialisierung fehlschlägt - gelegentlich habe ich mich an eine Ausnahme erinnert, um auf den ersten notwendigen Zugriff zu werfen, aber das ist ziemlich selten.

Es würde mich nicht genau zu erraten, wie, wie die CLR die Art über die Typargumente nachschlägt, aber ich bin mir ziemlich sicher, dass es zu Heck optimiert werde und zurück :)

1

Es speichert keine Werte für jeden generischen Typparameter so sehr, wie es tatsächlich (konzeptionell sowieso) N verschiedene Klassen erzeugt - eine für jeden Typ T, mit dem Sie es verwenden.

+0

Hmmm ... Bist du sicher, dass das richtig ist? Ich dachte, es würde nur eine Klasse für alle Referenztypen erstellt und dann eine für jeden Werttyp, mit dem Sie es verwenden könnten. –

+2

Es verwendet eine Kopie des systemeigenen Codes für alle Referenztypen, aber es gibt verschiedene Type-Objekte. –

1

Ich glaube, dass die generische (erste) Version die Wörterbuchsuche zur Kompilierzeit durchführt und daher zur Laufzeit besser funktioniert.

Es könnte jedoch mehr Speicher verwenden.

2

Ich habe es nicht profiliert (was ist der einzige Weg, um wirklich diese Frage zu beantworten - der Unterschied in der Leistung kann so klein sein, um bedeutungslos zu sein), aber ich würde vermuten, dass die Verriegelung der teure Teil ist. Die CLR erledigt das für Sie - und zwar in einer von Experten auf diesem Gebiet definierten Weise! - Ich denke also, wenn es einen Unterschied gibt, wäre es besser, das Sprachfeature zu verwenden, anstatt es selbst mit Dictionary + Sperren zu bauen.

Verwandte Themen