Подтвердить что ты не робот

Анонимный тип и кортеж

В чем разница между анонимным типом и кортежем?

4b9b3361

Ответ 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());
}

Это круто.