什么时候使用Tuple和KeyValuePair最好?

我通常使用KeyValuePair<TKey,TValue>types,只要我有一对是相关的数据,意思是一个是另一个的关键。 如果数据是不相关的,那么Tuple<T1,T2>types就更有意义了,我愿意这样做。

现在我只是阅读这篇文章 ,为什么一般要避免KeyValuePair<TKey,TValue> ,喜欢Tuple<T1,T2> 。 主要参数是Tuple<T1,T2>的性能优势。

在表演之外,是否有任何理由认为KVP会比Tuple<T1,T2>更好?

那么,这种types可以被认为是不好的名字,一个。 一个名为KeyValuePair应该代表一个键和一个值。 如果你的两个对象不是一个关键和价值,那么只有两件事情呢? 如果我看到一个KeyValuePair<TKey, TValue>types的方法或属性,我期望KVP的值是一个键和一个值。 这实际上只是一个沟通意图的问题,将来要明确自己,或者可能是其他团队成员。 元组不表示这种关联。

元组也可以更容易地添加另一个值,使它成为一个三元组(或者三元组,但是您想要调用它)。 一些.NET语言,如F#, 也有一些特殊的元组语法 。

对于一个实现的angular度来说, Tuple做了许多KeyValuePair没有的事情。 元组具有可比性,它们实现了IComparableIStructuralEquatable接口,所以它比较容易比较两个元组。

KeyValuePair是结构, Tuple是一个类。

这是影响如何通过引用或值复制对象的主要区别。

因此Tuple<T1,T2>在32位操作系统中使用“4byte”,而KeyValuePair<K,V>需要更多基于“K和V”

无论如何比较Tuple和KeyValuePair不是一个好主意(对我来说是不合理的),因为两者都有不同的目的。

尽pipe有语义,但考虑到两种select,性能可能是一个重要的考虑因素。 如前所述, KeyValuePair是一个值types(struct),而Tuple<>是一个引用types(class)。 因此, KeyValuePair被分配在堆栈上, Tuple<>被分配在堆上,最佳select通常由堆栈与堆内存分配的经典参数决定。 总之,堆栈空间是有限的,但通常访问速度非常快。 堆内存要大得多,但速度要慢一些。

KeyValuePair<T1, T2>可能是更好的select,如果键和值types都是原始types(值types如intbooldouble等)或小尺寸的结构。 对于堆栈中的原始types,分配和释放是闪电般的。 这可以真正影响性能,尤其是在recursion方法调用中。

另一方面,如果T1T2是引用types(如类), Tuple<T1, T2>可能是更好的select。 包含指向引用types(作为键或值types)的指针的KeyValuePair目的,因为无论如何都需要在堆上查找对象。

这是我在网上find的基准: Tuple与KeyValuePair 。 这个基准testing的唯一问题是他们testing了KeyValuePair<string, string>Tuple<string, string> ,而且stringtypes在.NET中是一个不寻常和特殊的types,它可以performance得像一个值types和/或者取决于执行上下文的引用types。 我相信KeyValuePair<int, int>Tuple<int, int>是一个明显的胜利者。 但是,即使存在这些缺陷,结果也表明性能差异可能是显着的:

8.23 ns – 分配元组
0.32 ns – 分配KeyValuePair (快25倍!)

1.93 ns – 传递Tuple作为参数
2.57 ns – 传递KeyValuePair作为参数

1.91 ns – 返回元组
6.09 ns – 返回KeyValuePair

2.79 ns – 从列表中加载元组
4.18 ns – 从列表中加载KeyValuePair

你真的问错误的问题正确的问题是使用一个类(Tuple)_比结构(KVP)更好,在这种情况下答案是你想要使用他们和答案在这里给出结构与类