В чем разница между анонимным типом и кортежем?
Анонимный тип и кортеж
Ответ 1
Анонимные типы имеют имена свойств, которые содержат больше информации, для кортежей у вас этого нет. Вы не можете использовать анонимные типы в качестве возвращаемых значений и параметров, хотя вы можете с кортежами.
Примером того, когда кортеж хорош, - это когда вы хотите вернуть несколько значений. @Petar Minchev упоминает эту ссылку, которая дает хороший пример.
Вам может понадобиться метод Find()
, который возвращает как индекс, так и значение. Другим примером может быть положение в плоскости 2d или 3d.
Ответ 2
Кортеж не является анонимным, это именованный тип. Вы можете использовать его как возвращаемый тип или аргумент метода. Этот код действителен:
Tuple<int, string> GetTuple()
{
return Tuple.Create(1, "Bob");
}
Вы не можете сделать это с анонимным типом, вам придется возвращать System.Object
. Как правило, вам нужно использовать Reflection для этих объектов (или dynamic
в .NET 4), чтобы получить значения отдельных свойств.
Кроме того, как упоминает Брайан, имена свойств в Tuple
фиксированы - они всегда Item1
, Item2
, Item3
и т.д., тогда как с анонимным типом вы выбираете имена, Если вы пишете:
var x = new { ID = 1, Name = "Bob" }
Тогда анонимный тип имеет свойства ID
и Name
. Но если вы пишете:
Tuple.Create(1, "Bob")
Тогда полученный набор имеет свойства Item1
и Item2
.
Ответ 3
Еще один момент в пользу анонимных типов заключается в том, что вы можете легко иметь более 8 свойств. Хотя это выполнимо с помощью кортежей, это не так красиво.
var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on
или напишите свои собственные классы кортежей.
Интересное сходство заключается в том, что как кортежи, так и анонимные типы дают вам неизменность и сопоставимость равенств (как переопределяет Equals
, так и GetHashCode
) на основе свойств по умолчанию.
Ответ 4
Просто небольшое обновление этого ответа, так как С# 7 находится в дикой природе. Кортежи теперь обладают сверхмощными полномочиями и могут иногда заменять анонимные типы и классы. Возьмем, к примеру, этот метод, который принимает и возвращает кортежи с именованными свойствами.
void Main()
{
var result = Whatever((123, true));
Debug.Assert(result.Something == 123);
Debug.Assert(result.Another == "True");
}
(int Something, string Another) Whatever((int Neat, bool Cool) data)
{
return (data.Neat, data.Cool.ToString());
}
Это круто.