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

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


person Amutha    schedule 10.04.2010    source источник
comment
Вот статья, объясняющая, что вам нужно: msdn.microsoft.com/en-us /vcsharp/ee957397.aspx   -  person Petar Minchev    schedule 10.04.2010


Ответы (4)


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

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

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

person Brian R. Bondy    schedule 10.04.2010

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

Это классно.

person Alex Dresko    schedule 18.05.2017
comment
Имейте в виду, что эти кортежи — это не то же самое, что старые добрые кортежи или анонимные типы. Это ValueTuples, представляющие собой структуры с полями, тогда как анонимные типы представляют собой классы со свойствами. - person Michael Yutsis; 11.09.2019

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

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.

person Aaronaught    schedule 10.04.2010
comment
Часть об именах всегда Item1, Item2 больше не верна для C# 7. См. ответ @alex-dresko выше. - person codeMonkey; 13.06.2019
comment
Item1 и Item2 по-прежнему можно использовать, даже если его свойства названы ID и Name. Затем item1 будет ссылаться на ID. Это работает в C # 7 и выше. - person Michael Santos; 15.12.2019

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

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

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


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

person nawfal    schedule 28.06.2014