Zwykle KeyValuePair<TKey,TValue>
używam tego typu, gdy mam dane związane z parami w tym sensie, że jeden jest kluczem do drugiego. Jeśli dane są niepowiązane, Tuple<T1,T2>
typ ma więcej sensu i poszedłbym z tym.
Teraz właśnie przeczytałem ten artykuł o tym, dlaczego ogólnie należy unikać KeyValuePair<TKey,TValue>
i preferować Tuple<T1,T2>
. Głównym argumentem jest korzyść wydajnościowa Tuple<T1,T2>
.
Wydajność zewnętrzna, czy jest jakiś powód, dla którego KVP byłby lepszym wyborem niż Tuple<T1,T2>
?
KeyValuePair
to klucz i wartość, aTuple<T1,T2>
to tylko para równych wartości. Możesz także zapytać: „dlaczego powinienem używać,List<Class>
jeśli mogę użyćDictionary<A,B>
”.Odpowiedzi:
Cóż, na przykład typ można uznać za słabo nazwany. Nazwa KeyValuePair powinna reprezentować klucz i wartość. A co, jeśli twoje dwa obiekty nie są tak naprawdę kluczem i wartością, tylko dwiema rzeczami? Gdybym miał zobaczyć metodę lub właściwość, która ma typ
KeyValuePair<TKey, TValue>
, oczekiwałbym, że wartości KVP będą kluczem i wartością. Tak naprawdę jest to tylko kwestia zakomunikowania intencji i wyjaśnienia go sobie w przyszłości lub innym członkom zespołu. Krotka nie wskazuje na taki rodzaj skojarzenia.Krotki ułatwiają również dodawanie kolejnej wartości, dzięki czemu jest to trójka (lub trójka, jakkolwiek chcesz ją nazwać). Niektóre języki .NET, takie jak F #, mają również specjalną składnię dotyczącą krotek.
Z punktu widzenia implementacji,
Tuple
wiele rzeczyKeyValuePair
nie robi. Krotki są porównywalne, implementują interfejsyIComparable
iIStructuralEquatable
, dzięki czemu łatwiej jest porównać dwie krotki.źródło
KeyValuePair
jest strukturą iTuple
jest klasą.To jest główna różnica, która wpływa na sposób kopiowania obiektów, czy to przez odniesienie, czy przez wartości.
i dlatego
Tuple<T1,T2>
gdy jest przekazywany dookoła, używa tylko "4 bajtów" w 32-bitowym systemie operacyjnym, podczas gdyKeyValuePair<K,V>
wymaga więcej w oparciu o "K i V"W każdym razie porównanie Tuple i KeyValuePair nie jest dobrym pomysłem (nie ma dla mnie sensu), ponieważ oba służą różnym celom.
źródło
Pomimo semantyki wydajność może być ważnym czynnikiem, biorąc pod uwagę obie opcje. Jak wcześniej wspomniano,
KeyValuePair
jest typem wartości (struct), podczas gdyTuple<>
jest typem referencyjnym (klasą). W związku z tymKeyValuePair
alokacja jest przydzielana na stosie, aTuple<>
na stercie, a optymalny wybór jest zwykle określany przez klasyczne argumenty alokacji pamięci stosu względem sterty. . Krótko mówiąc, przestrzeń w stosie jest ograniczona, ale ogólnie ma bardzo szybki dostęp. Pamięć sterty jest znacznie większa, ale jest nieco wolniejsza.KeyValuePair<T1, T2>
może być lepszym wyborem, jeśli zarówno klucz i wartość typy są prymitywy (typy wartości podobaint
,bool
,double
, itd.) lub elemencie małej wielkości. Przy typach prymitywnych na stosie alokacja i zwalnianie przydziałów przebiega błyskawicznie. Może to naprawdę wpłynąć na wydajność, zwłaszcza jako argumenty wywołań metod rekurencyjnych.Z drugiej strony
Tuple<T1, T2>
jest prawdopodobnie lepszym wyborem, jeśli jeden z typów referencyjnychT1
lubT2
są to typy referencyjne (takie jak klasy). A,KeyValuePair
który zawiera wskaźniki do typów referencyjnych (jako typy klucza lub typy wartości), pokonuje cel, ponieważ obiekty i tak będą musiały być wyszukiwane na stercie.Oto test porównawczy, który znalazłem online: Tuple vs. KeyValuePair . Jedynym problemem związanym z tym testem porównawczym jest to, że testowali je w
KeyValuePair<string, string>
porównaniuTuple<string, string>
zstring
typem , a typ jest nietypowym i specjalnym typem w .NET, ponieważ może zachowywać się zarówno jak typ wartości i / lub typ referencyjny w zależności od kontekstu wykonania. Uważam, żeKeyValuePair<int, int>
byłby wyraźnym zwycięzcą przeciwkoTuple<int, int>
. Jednak nawet przy niedociągnięciach wyniki pokazują, że różnice w wydajności mogą być znaczące:źródło
Naprawdę zadajesz złe pytanie właściwym pytaniem jest użycie klasy (krotki) _ lepszej niż struktury (KVP) w takim przypadku odpowiedzią jest to, do czego chcesz ich użyć, a odpowiedź jest podana tutaj Struktury kontra klasy
źródło