Ich habe den KeyValuePair<TKey,TValue>
Typ im Allgemeinen immer dann verwendet, wenn ich Daten habe, die paarweise in dem Sinne sind, dass einer ein Schlüssel zum anderen ist. Wenn die Daten nicht in Beziehung stehen, ist der Tuple<T1,T2>
Typ sinnvoller und ich würde damit weitermachen.
Jetzt habe ich gerade diesen Artikel darüber gelesen, warum man generell meidet KeyValuePair<TKey,TValue>
und bevorzugt Tuple<T1,T2>
. Das Hauptargument ist der Leistungsvorteil von Tuple<T1,T2>
.
Gibt es einen Grund, warum ein KVP außerhalb der Leistung eine bessere Wahl wäre als ein Tuple<T1,T2>
?
KeyValuePair
ist ein Schlüssel und ein Wert, aTuple<T1,T2>
ist nur ein Paar gleicher Werte. Sie könnten auch fragen: "Warum sollte ich ein verwenden,List<Class>
wenn ich verwenden kannDictionary<A,B>
".Antworten:
Nun, der Typ könnte zum einen als schlecht benannt angesehen werden. Ein KeyValuePair mit dem Namen sollte einen Schlüssel und einen Wert darstellen. Was ist, wenn Ihre beiden Objekte nicht wirklich ein Schlüssel und ein Wert sind, sondern nur zwei Dinge? Wenn ich eine Methode oder Eigenschaft sehen würde, die einen Typ von hat
KeyValuePair<TKey, TValue>
, würde ich erwarten, dass die Werte der KVP ein Schlüssel und ein Wert sind. Dies ist wirklich nur eine Frage der Kommunikation von Absichten und der Klärung gegenüber sich selbst oder möglicherweise anderen Teammitgliedern in der Zukunft. Ein Tupel zeigt diese Art von Assoziation nicht an.Tupel erleichtern auch das Hinzufügen eines weiteren Werts, sodass es sich um ein 3-Tupel (oder ein Triplett, wie auch immer Sie es nennen möchten) handelt. Einige .NET-Sprachen wie F # haben auch eine spezielle Syntax für Tupel.
Für eine Implementierungsperspektive tun
Tuple
viele DingeKeyValuePair
nicht. Tupel sind vergleichbar, sie implementieren die SchnittstellenIComparable
und undIStructuralEquatable
erleichtern so den Vergleich zweier Tupel.quelle
KeyValuePair
ist struct undTuple
ist eine Klasse.Dies ist der Hauptunterschied, der beeinflusst, wie die Objekte kopiert werden, sei es als Referenz oder als Wert.
und verwendet daher
Tuple<T1,T2>
bei Weitergabe nur "4 Byte" in 32-Bit-Betriebssystemen, währendKeyValuePair<K,V>
mehr basierend auf "K und V" erforderlich ist.Der Vergleich von Tuple und KeyValuePair ist jedoch keine gute Idee (macht für mich keinen Sinn), da beide unterschiedlichen Zwecken dienen.
quelle
Trotz der Semantik kann die Leistung eine wichtige Überlegung sein, wenn Sie beide Optionen in Betracht ziehen. Wie bereits erwähnt,
KeyValuePair
ist das ein Werttyp (Struktur), während dasTuple<>
ein Referenztyp (Klasse) ist. Daher wird dasKeyValuePair
auf dem Stapel und dasTuple<>
auf dem Heap zugewiesen, und die optimale Auswahl wird normalerweise durch die klassischen Argumente Stack vs. Heap Memory Allocation bestimmt . Kurz gesagt, der Stapelspeicher ist begrenzt, hat aber im Allgemeinen einen sehr schnellen Zugriff. Der Heapspeicher ist viel größer, aber etwas langsamer.KeyValuePair<T1, T2>
die bessere Wahl sein , wenn sowohl der Schlüssel und Werttypen Primitive sind (Werttypen wieint
,bool
,double
usw.) oder structs von geringer Größe. Mit primitiven Typen auf dem Stapel ist die Zuweisung und Freigabe blitzschnell. Dies kann die Leistung erheblich beeinträchtigen, insbesondere als Argumente für rekursive Methodenaufrufe.Auf der anderen Seite
Tuple<T1, T2>
ist wahrscheinlich die bessere Wahl, wenn entwederT1
oderT2
sind Referenztypen (wie Klassen). AKeyValuePair
, das Zeiger auf Referenztypen (als Schlüssel- oder Werttypen) enthält, macht den Zweck zunichte, da die Objekte ohnehin auf dem Heap nachgeschlagen werden müssen.Hier ist ein Benchmark, den ich online gefunden habe: Tuple vs. KeyValuePair . Das einzige Problem mit diesem Benchmark ist , dass sie getestet
KeyValuePair<string, string>
vs.Tuple<string, string>
und derstring
Typ ist eine ungewöhnliche und besondere Art in .NET, dass sie beide wie ein Werttyp verhalten können und / oder einen Referenztyp auf dem Ausführungskontext abhängig. Ich glaube, dasKeyValuePair<int, int>
wäre ein klarer Sieger gewesenTuple<int, int>
. Trotz der Mängel zeigen die Ergebnisse jedoch, dass die Leistungsunterschiede erheblich sein können:quelle
Wenn Sie wirklich die falsche Frage stellen, verwendet die richtige Frage eine Klasse (Tupel) _ besser als eine Struktur (KVP). In diesem Fall lautet die Antwort, wofür Sie sie verwenden möchten, und die Antwort wird hier gegeben. Strukturen versus Klassen
quelle