Кортежи в C# (Их плюсы и минусы)
В C# есть такая коллекция как кортежи и у меня возник вопрос. В чем отличия кортежей и массивов и где преобладает каждый тип и в C# кортеж подразумевается, как неизменяемым тип данных или как-то иначе?
Ответы (2 шт):
Так то в документации всё написано. Но если кратко - это простой способ сгруппировать несколько переменных (часто разного типа и вообще слабо связанных между собой) в легковесный объект, чтобы, например, вернуть его из функции и получить потом простой доступ к его элементам (в последних версиях C# возможен доступ по задаваемым названиям полей, а не только по названию-индексу).
System.Tuple- традиционные, не изменяемые кортежи и работать с ними не очень удобноSystem.ValueTuple- изменяемые кортежи из современной версии C#, более удобные в обращении
Массив же - это коллекция элементов одного типа с доступом к элементам массива по числовому индексу.
Кортежи - это НЕ массивы и вообще не коллекции. По своему устройству они больше напоминают структуры.
Есть 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)