Wrapper in .NET: Struktur oder Klasse?
Frage
Sie sich das folgende Szenario vor:
int Caller1<T>(T t) where T : IInterface {...}
T Caller2<T>() where T : IInterface {...}
class Wrappee // doesn't implement IInterface, but could
??? Wrapper : IInterface {
private readonly Wrappee _wrappee;
// methods call _wrappee's methods
}
Jetzt ist die allgemeine Beratung für die Wahl zwischen struct
und class
ist „Verwendung struct
, wenn Sie Wert Semantik und class
Referenz Semantik benötigen“. Die Semantik wir brauchen, ist „Bezug auf Wrappee
“. Aber es scheint, können wir immer noch Wrapper
eine Struktur machen: Kopieren seinen Wertes ist das gleiche ist das gleiche wie eine Wrappee
Referenz Kopieren und die Kopien einen Verweis auf das same haben Objekt! Overhead ist niedriger und Professional .NET 2.0 Generics und Peter Ritchie auf MSDN Foren Abwesenheit des Boxens im ersten Fall.
Lösung
Oft Ihre Klasse / Struktur wird durch Methoden auf intern Sie (Sie zeigen nicht, was Caller1 und Caller2 tun), und es wird wahrscheinlich boxed erhält in diesem Fall rufen gespeichert oder weitergegeben werden. Möglicherweise häufiger als erwartet. Also, wenn Sie nachweisen können, dass eine Struktur Art und Weise effizienter sein wird. Nicht die Mühe machen und nur mit einer Klasse-Stick
Außerdem sind structs oft verpönt, wenn sie so etwas wie ein Datentyp darstellen, so eine Klasse chosing könnte künftige Diskussionen von einer anderen Natur verhindern.
Wenn jedoch die Leistung ist wirklich ein Anliegen, und wenn Sie können garantieren, dass Instanzen nur als Parameter mit einer generischen Typeinschränkung übergeben werden, und nie in Interface typisierte Feldern oder Sammlungen gespeichert, die Strom inlining von Strukturen durch die .NET-Laufzeit wird effizienter sein, als Wrapper-Struktur meist wird wegoptimiert. Aber das ist eine Menge von ifs.
Andere Tipps
Ja, da Sie Wrapper über eine IInterface Variable zugreifen, um zu verhindern Boxen, soll es eine Klasse sein.
EDIT:. Wenn Sie Wrapper über eine Variable eingegeben als Wrapper zuzugreifen und Zugang Wrapper Methoden, diese Methoden nicht IInterface, dann eine Struktur ist in Ordnung
Ich würde sagen, Klasse, weil Sie Verhalten sind einkapseln, nicht nur Daten.