Незважаючи на семантику, продуктивність може бути важливим фактором, оскільки ви розглядаєте обидва варіанти. Як уже згадувалося раніше, KeyValuePairце тип значення (struct), тоді як the Tuple<>- тип посилання (клас). Отже, KeyValuePairвиділяється в стеку, а в Tuple<>купі, і оптимальний вибір зазвичай визначається класичними аргументами Stack vs. Heap Memory Allocation . Коротше кажучи, простір стека обмежений, але, як правило, має дуже швидкий доступ. Пам'ять купи значно більша, але дещо повільніша.
KeyValuePair<T1, T2>може бути кращим вибором , якщо як ключ і значення типу примітиви (типу значення , як int, bool, doubleі т.д.) або Структури малого розміру. З примітивними типами в стеку розподіл та вивільнення відбувається блискавично. Це може реально вплинути на продуктивність, особливо як аргументи для викликів рекурсивних методів.
З іншого боку, Tuple<T1, T2> швидше за все, кращий вибір, якщо той T1чи інший T2є посилальними типами (наприклад, класи). А, KeyValuePairяке містить покажчики на типи посилань (як типи ключів або значень), перешкоджає цілі, оскільки об’єкти все одно потрібно буде шукати в купі.
Ось орієнтир, який я знайшов в Інтернеті: Tuple проти KeyValuePair . Єдина проблема з цим тестом полягає в тому, що вони тестували KeyValuePair<string, string>проти Tuple<string, string>, а stringтип є незвичним та особливим типом у .NET, оскільки він може поводитися як тип значення, так і / або тип посилання, залежно від контексту виконання. Я вважаю, що він KeyValuePair<int, int>би був явним переможцем Tuple<int, int>. Однак, навіть маючи недоліки, результати показують, що відмінності в роботі можуть бути значними:
8,23 нс - Виділити кортеж
0,32 нс - Розподілити KeyValuePair (в 25 разів швидше!)
1,93 нс - Передати кортеж як аргумент
2,57 нс - Передати KeyValuePair як аргумент
1,91 нс - зворотний кортеж
6,09 нс - повернення KeyValuePair
2,79 нс - Завантажити кортеж зі списку
4,18 нс - Завантажити KeyValuePair зі списку
KeyValuePair- це ключ і значення, aTuple<T1,T2>- просто пара рівних значень. Ви також можете запитати: "навіщо мені використовувати a,List<Class>якщо я можу використовуватиDictionary<A,B>".