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

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

27 голосов
/ 10 апреля 2010

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

Ответы [ 4 ]

22 голосов
/ 18 мая 2017

Просто небольшое обновление к этому ответу, так как C # 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());
}

Это круто.

20 голосов
/ 10 апреля 2010

Кортеж - это не анонимный тип, это именованный тип. Вы можете использовать его в качестве возвращаемого типа или аргумента метода. Этот код действителен:

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.

18 голосов
/ 10 апреля 2010

Анонимные типы имеют имена свойств, которые содержат больше информации, для кортежей у вас этого нет. Вы не можете использовать анонимные типы в качестве возвращаемых значений и параметров, хотя вы можете использовать и с кортежами.

Пример, когда кортеж хорош, это когда вы хотите вернуть несколько значений. @Petar Minchev упоминает эту ссылку , которая дает хороший пример.

Возможно, вам понадобится метод Find(), который возвращает индекс и значение. Другим примером может быть положение в 2d или 3d плоскости.

8 голосов
/ 28 июня 2014

Еще один момент в пользу анонимных типов заключается в том, что вы можете легко иметь более 8 свойств. Хотя это возможно с помощью кортежей, это не так красиво.

var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on

или напишите свои собственные классы кортежей.


Интересно отметить, что кортежи и анонимные типы обеспечивают неизменность и сопоставимость по равенству (оба переопределяют Equals и GetHashCode) на основе свойств по умолчанию.

...