В чем разница между анонимным типом и кортежем?
Анонимный тип и кортеж
Ответы (4)
Анонимные типы имеют имена свойств, которые несут больше информации, для кортежей у вас нет этого. Однако вы не можете использовать анонимные типы в качестве возвращаемых значений и параметров, и вы можете использовать кортежи.
Примером того, когда кортеж удобен, является ситуация, когда вы хотите вернуть несколько значений. @Petar Minchev упоминает эту ссылку, которая дает хороший пример.
Вам может понадобиться метод Find()
, который возвращает и индекс, и значение. Другим примером может быть положение в 2d или 3d плоскости.
Просто небольшое обновление этого ответа, так как С# 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());
}
Это классно.
Кортеж — это не анонимный тип, это именованный тип. Вы можете использовать его как возвращаемый тип или аргумент метода. Этот код действителен:
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
.
Item1
, Item2
больше не верна для C# 7. См. ответ @alex-dresko выше.
- person codeMonkey; 13.06.2019
Еще один аргумент в пользу анонимных типов заключается в том, что вы можете легко иметь более 8 свойств. Хотя это выполнимо с помощью кортежей, это не так красиво.
var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on
или напишите свои собственные классы кортежей.
Следует отметить интересное сходство: как кортежи, так и анонимные типы обеспечивают неизменность и сопоставимость по равенству (оба переопределяют Equals
и GetHashCode
) на основе свойств по умолчанию.