Кортежи в C# (Их плюсы и минусы)

В C# есть такая коллекция как кортежи и у меня возник вопрос. В чем отличия кортежей и массивов и где преобладает каждый тип и в C# кортеж подразумевается, как неизменяемым тип данных или как-то иначе?


Ответы (2 шт):

Автор решения: CrazyElf

Так то в документации всё написано. Но если кратко - это простой способ сгруппировать несколько переменных (часто разного типа и вообще слабо связанных между собой) в легковесный объект, чтобы, например, вернуть его из функции и получить потом простой доступ к его элементам (в последних версиях C# возможен доступ по задаваемым названиям полей, а не только по названию-индексу).

  • System.Tuple - традиционные, не изменяемые кортежи и работать с ними не очень удобно
  • System.ValueTuple - изменяемые кортежи из современной версии C#, более удобные в обращении

Массив же - это коллекция элементов одного типа с доступом к элементам массива по числовому индексу.

→ Ссылка
Автор решения: Blackmeser

Кортежи - это НЕ массивы и вообще не коллекции. По своему устройству они больше напоминают структуры.

Есть 2 типа: System.Tuple и System.ValueTuple

Плюс: кортежи компактны, не обязательно отдельное описание как в случае с структурами и классами (но оно возможно), идеально подходят для возврата группы значений из метода. Например: return (1, "a");

Минус: сложно реализовывать внутреннюю логику объекта (методы через методы расширения, отсутствие приватных полей), которая будет очень ограниченной.

Кортежи на примере 2х полей: int и string (могут быть и другие)

(int, string) tuple1 = (1, "a"); //доступ к элементам через Item1 и Item2
(int index, string charS) tuple2 = (1, "a"); //доступ к элементам через index и charS (только такой кортеж может содержать именованные поля)

using MyTUPLE = System.Tuple<int, string>; //кортеж на основе класса (может быть null)
MyTUPLE mt = new Tuple<int, string>(1, "a"); //доступ к элементам через Item1 и Item2

using MyTUPLE = System.ValueTuple<int, string>; //кортеж like struct (не может быть null)
MyTUPLE mt = (1, "a"); //доступ к элементам через Item1 и Item2

using MyTUPLE = System.ValueTuple<int, string>;
MyTUPLE? mt = null; //кортеж like nullable struct (может быть null)
→ Ссылка