Я обычно использую этот KeyValuePair<TKey,TValue>
тип всякий раз, когда у меня есть данные, связанные с парами, в том смысле, что одно является ключом к другому. Если данные не связаны между собой, тогда Tuple<T1,T2>
тип имеет больше смысла, и я бы пошел с этим.
Теперь я просто прочитал эту статью о том, почему вообще следует избегать KeyValuePair<TKey,TValue>
и предпочитать Tuple<T1,T2>
. Основным аргументом является преимущество в производительности Tuple<T1,T2>
.
Помимо производительности, есть ли причина, по которой KVP был бы лучшим выбором, чем KVP Tuple<T1,T2>
?
KeyValuePair
- это ключ и значение, aTuple<T1,T2>
- это просто пара равных значений. Вы также можете спросить: «Зачем мне использовать,List<Class>
если я могу использоватьDictionary<A,B>
».Ответы:
Ну, например, этот тип можно считать плохо названным. KeyValuePair, как указано, должен представлять ключ и значение. Что, если ваши два объекта на самом деле не ключ и значение, а всего лишь две вещи? Если бы я увидел метод или свойство с типом
KeyValuePair<TKey, TValue>
, я бы ожидал, что значения KVP будут ключом и значением. На самом деле это просто вопрос передачи намерения и разъяснения его себе в будущем или, возможно, другим членам команды. Кортеж не указывает на такую связь.Кортежи также упрощают добавление другого значения, делая его трехкортежным (или триплетом, как вы хотите его называть). Некоторые языки .NET, такие как F #, также имеют специальный синтаксис для кортежей.
С точки зрения реализации
Tuple
много чегоKeyValuePair
не делает. Кортеж сравним, они реализуютIComparable
иIStructuralEquatable
интерфейсы, так что облегчает сравнение двух кортежей.источник
KeyValuePair
структура иTuple
класс.Это основное отличие, которое влияет на то, как объекты копируются по ссылке или по значениям.
и, следовательно,
Tuple<T1,T2>
при передаче просто использует "4 байта" в 32-битной ОС, тогда какKeyValuePair<K,V>
требует большего количества на основе "K и V"В любом случае сравнение Tuple и KeyValuePair не является хорошей идеей (для меня не имеет смысла), поскольку оба служат разным целям.
источник
Несмотря на семантику, производительность может быть важным фактором при рассмотрении обоих вариантов. Как упоминалось ранее,
KeyValuePair
это тип значения (структура), тогда какTuple<>
это ссылочный тип (класс). Таким образом,KeyValuePair
объект выделяется в стеке, а объектTuple<>
- в куче, и оптимальный выбор обычно определяется классическими аргументами распределения памяти стека или кучи . Короче говоря, пространство стека ограничено, но обычно имеет очень быстрый доступ. Память кучи намного больше, но работает несколько медленнее.KeyValuePair<T1, T2>
может быть лучшим выбором , если как ключ и значение типа примитивы (типа значения , какint
,bool
,double
и т.д.) или Структуры малого размера. С примитивными типами в стеке распределение и освобождение происходит молниеносно. Это действительно может повлиять на производительность, особенно в качестве аргументов для вызовов рекурсивных методов.С другой стороны,
Tuple<T1, T2>
вероятно, лучший выбор, если любой изT1
илиT2
является ссылочными типами (например, классами). A,KeyValuePair
который содержит указатели на ссылочные типы (например, типы ключей или значений), как бы побеждает цель, поскольку объекты в любом случае нужно будет искать в куче.Вот тест, который я нашел в Интернете: Tuple vs. KeyValuePair . Единственная проблема с этим тестом заключается в том, что они тестировали
KeyValuePair<string, string>
vs.Tuple<string, string>
, и этотstring
тип является необычным и особым типом в .NET, поскольку он может вести себя как тип значения, так и / или ссылочный тип в зависимости от контекста выполнения. Я считаю,KeyValuePair<int, int>
что противTuple<int, int>
. Однако даже с учетом недостатков результаты показывают, что различия в производительности могут быть значительными:источник
Вы действительно задаете неправильный вопрос, правильный вопрос - это использование Class (Tuple) _ лучше, чем Struct (KVP), и в этом случае ответ - это то, для чего вы хотите их использовать, и ответ дается здесь. Структуры по сравнению с классами
источник