На початку я хочу згадати, що C # вже підтримував анонімні типи . Які є еталонними типами. Таким чином, ви вже мали відповідну альтернативу створенню іменованого класу.
Однією з переваг іменованого класу є легше повторне використання (наприклад, якщо вам потрібен однаковий тип у кількох місцях) та документування. Оскільки анонімний тип є анонімним, ви можете отримати змінні, набрані до нього, лише якщо ви можете використовувати це var
, що обмежує контексти, в яких корисні анонімні типи (наприклад, ви не можете використовувати їх як типи полів, типи повернення або типи параметрів) .
Звичайно, ви можете перейти до деяких обмежень анонімних типів, використовуючи System.Tuple
. Це також посилальний тип, і ви можете використовувати його явно. Недоліком є те, що в ньому відсутні спеціальні імена для членів.
Кортежі C # 7 ( ValueTuple
) можна вважати подібними до анонімних типів. Перша відмінність полягає в тому, що вони є типами цінностей. Це означає, що ці кортежі матимуть переваги в продуктивності до тих пір, поки вони залишаться в локальному масштабі або переміщаються по стеку (що є загальним використанням анонімних типів через його обмеження).
Друга відмінність полягає в тому, що новий синтаксис дозволяє кортежі з'являтися в більшій кількості місць, ніж анонімні типи, як ви знаєте, у вас є синтаксичний цукор для визначення типу повернення ValueTuple
(при використанні анонімних типів вам довелося повернути object
).
Третя відмінність полягає в тому, що ValueTuple
підтримується деконструкція з коробки. Процитувавши Нове у C # 7.0 :
Інший спосіб споживання кортежів - це їх деконструкція. Декларація деконструкції - це синтаксис для розділення кортежу (або іншого значення) на його частини та присвоєння цих частин окремо змінним:
(string first, string middle, string last) = LookupName(id1);
WriteLine($"found {first} {last}.");
Що ви також можете зробити із користувацькими типами, додавши метод Deconstruct .
Для реферату:
ValueTuple
має синтаксичний цукор в C # 7.0, що слід враховувати для читабельності.
ValueTuple
є типом значення. Усі плюси і мінуси між використанням a class
та struct
apply.
ValueTuple
може використовуватися просто (з синтаксичним цукром або без нього), що дозволяє йому мати універсальність System.Tuple
, зберігаючи іменовані члени.
ValueTuple
підтримує деконструкцію.
Враховуючи, що суттєвим елементом є синтаксичний цукор, я б сказав, що сильнішим аргументом для вибору ValueTuple
є той самий аргумент для вибору a struct
. Що було б ідеально для невеликих, незмінних типів, які живуть здебільшого на стеці (так що у вас не так багато боксу та розпакування).
Порівнюючи ValueTuple
з повномасштабною структурою, враховуючи синтаксичний цукор, я б запропонував використовувати ValueTuple
за замовчуванням, якщо вам не потрібен явний макет або вам потрібно додати до нього методи.
Я також хочу сказати, що синтаксичний цукор не обов'язково покращує читабельність. Основною причиною є те, що ви не називаєте тип, а ім'я типу надає значення коду. На додаток до цього, ви можете додати документацію до декларації struct
або class
декларації, що полегшує розуміння.
Загалом, ситуація, коли по- ValueTuple
справжньому блищить, повертає безліч значень з методу. У цьому випадку відпадає необхідність створення нових out
параметрів. А документація ValueTuple
використовуваного може жити в документації методу. Якщо ви виявите, що вам потрібно зробити щось інше за допомогою ValueTuple
(наприклад, визначення методів розширення), я пропоную замість цього створити іменований тип.