Geralmente, uso o KeyValuePair<TKey,TValue>
tipo sempre que tenho dados relacionados aos pares, no sentido de que um é a chave para o outro. Se os dados não estiverem relacionados, o Tuple<T1,T2>
tipo faz mais sentido e eu aceitaria isso.
Acabei de ler este artigo sobre por que geralmente evitar KeyValuePair<TKey,TValue>
e preferir Tuple<T1,T2>
. O principal argumento é o benefício de desempenho de Tuple<T1,T2>
.
Desempenho externo, há algum motivo pelo qual um KVP seria uma escolha melhor do que um Tuple<T1,T2>
?
KeyValuePair
é uma chave e um valor, aTuple<T1,T2>
é apenas um par de valores iguais . Você também pode perguntar: "por que devo usar umList<Class>
se eu posso usarDictionary<A,B>
".Respostas:
Bem, o tipo pode ser considerado mal nomeado, por exemplo. Um KeyValuePair conforme nomeado deve representar uma chave e um valor. E se seus dois objetos não forem realmente uma chave e um valor, apenas duas coisas? Se eu visse um método ou propriedade que tivesse um tipo de
KeyValuePair<TKey, TValue>
, esperaria que os valores do KVP fossem uma chave e um valor. Na verdade, é apenas uma questão de comunicar a intenção e deixar isso claro para você mesmo ou, possivelmente, para outros membros da equipe. Uma tupla não indica esse tipo de associação.As tuplas também facilitam a adição de outro valor, tornando-o um 3-tupla (ou um trio, como você quiser chamá-lo). Algumas linguagens .NET, como F #, têm sintaxe especial em torno das tuplas também.
Para uma perspectiva de implementação,
Tuple
muitas coisasKeyValuePair
não fazem. As tuplas são comparáveis, elas implementam as interfacesIComparable
eIStructuralEquatable
, portanto, torna mais fácil comparar duas tuplas.fonte
KeyValuePair
é struct eTuple
é uma classe.Essa é a principal diferença que influencia como os objetos são copiados seja por referência ou por valores.
e, portanto,
Tuple<T1,T2>
quando transmitido apenas usa "4byte" no sistema operacional de 32 bits, enquantoKeyValuePair<K,V>
requer mais com base em "K e V"De qualquer forma, comparar Tuple e KeyValuePair não é uma boa ideia (não faz sentido para mim), pois ambos servem a propósitos diferentes.
fonte
Apesar da semântica, o desempenho pode ser uma consideração importante quando você considera as duas opções. Conforme mencionado anteriormente, o
KeyValuePair
é um tipo de valor (estrutura), enquanto oTuple<>
é um tipo de referência (classe). Portanto, oKeyValuePair
é alocado na pilha e oTuple<>
é alocado no heap, e a escolha ideal geralmente é determinada pelos argumentos clássicos de Stack vs. Heap Memory Allocation . Resumindo, o espaço da pilha é limitado, mas geralmente tem acesso muito rápido. A memória heap é muito maior, mas um pouco mais lenta.KeyValuePair<T1, T2>
pode ser a escolha melhor se tanto a chave e valor tipos são primitivos (tipos de valor, comoint
,bool
,double
, etc.) ou estruturas de pequena dimensão. Com tipos primitivos na pilha, a alocação e desalocação são extremamente rápidas. Isso pode realmente afetar o desempenho, especialmente como argumentos para chamadas de método recursivas.Por outro lado,
Tuple<T1, T2>
é provavelmente a melhor escolha seT1
ouT2
forem tipos de referência (como classes). UmKeyValuePair
que contém ponteiros para tipos de referência (como os tipos de chave ou valor) meio que anula o propósito, pois os objetos precisarão ser pesquisados no heap de qualquer maneira.Aqui está um benchmark que encontrei online: Tuple vs. KeyValuePair . O único problema com esse benchmark é que eles testaram
KeyValuePair<string, string>
vs.Tuple<string, string>
, e ostring
tipo é um tipo incomum e especial no .NET, pois pode se comportar como um tipo de valor e / ou um tipo de referência dependendo do contexto de execução. Eu acredito que oKeyValuePair<int, int>
teria sido um claro vencedor contraTuple<int, int>
. Mesmo com as deficiências, no entanto, os resultados mostram que as diferenças de desempenho podem ser significativas:fonte
Você realmente está fazendo a pergunta errada, a pergunta apropriada é usar uma Classe (Tupla) _ melhor do que uma Struct (KVP), caso em que a resposta é para que você deseja usá-los e a resposta é dada aqui Structs versus classes
fonte