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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top