Как использовать анонимные типы в С#?

Я видел множество описаний, как работают анонимные типы, но я не уверен, насколько они действительно полезны. Каковы некоторые сценарии, которые анонимные типы могут использоваться для решения в хорошо продуманной программе?

Ответы

Ответ 1

Анонимные типы не имеют ничего общего с дизайном систем или даже на уровне класса. Это инструмент, который разработчики могут использовать при кодировании.

Я даже не рассматриваю анонимные типы как типы per-se. Я использую их в основном как анонимные кортежи на уровне метода. Если я запрашиваю базу данных и затем обрабатываю результаты, я бы предпочел создать анонимный тип и использовать это, а не объявлять совершенно новый тип, который никогда не будет использоваться или не известен за пределами моего метода.

Например:

var query = from item in database.Items
            // ...
            select new { Id = item.Id, Name = item.Name };

return query.ToDictionary(item => item.Id, item => item.Name);

Никто не заботится о `a, анонимном типе. Это там, поэтому вам не нужно объявлять другой класс.

Ответ 2

От LINQ в действии (стр. 76, раздел 2.6.3):

... анонимные типы [являются] отличным инструментом для быстрых и простых временных результатов. Нам не нужно объявлять классы временными результатами, благодаря временным типам.

в основном они полезны для временного хранения информации в локальной области. Что-то еще требует использования рефлексии и может стать проблемой. Пример, который они приводят в вышеприведенной книге, написан в письменной форме, чтобы объединить идентификатор, имя и объем памяти, занятой каждым запущенным процессом. Они создают анонимный тип, добавляют его в список (все один оператор), а затем используют ObjectDumper для его вывода. Поэтому код больше не нуждается в отдельном объявленном классе для хранения идентификатора, имени и памяти, но все они объявили неявно, доводя счетчик строк до 4:

var pl = new List<Object>();
foreach(var p in Process.GetProcesses())
  pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64});
ObjectDumper.Write(pl);

Ответ 3

Используйте их с Linq.

Ответ 4

Наиболее популярным использованием анонимных типов является определение прогнозов в запросе LINQ to SQL.

Этот запрос

from x in db.Table1 select new {x.Column1, Alias2=x.Column2}

будет преобразован в этот SQL:

SELECT Column1, Column2 AS Alias2 FROM Table1

С анонимными типами вы можете создавать специальные прогнозы без предварительного указания типа для него. Компилятор определит тип для вас.

Ответ 5

При создании типов для целей "Использовать и бросить". Это похоже на LINQ. Кажется, это способ создания структур с полями "на лету" для запроса LINQ. Возврат struct/type только с указанными полями. Если не для этого, вам нужно объявить тип .Net для каждой уникальной комбинации полей, которые вы хотите получить.

Ответ 6

Важно знать, что LINQ не заставляет вас использовать анонимные типы. Вы также можете писать нормальные объекты после выбора.

var query = from item in database.Items
// ...
select new Person(item.id, item.Name)

Это предотвращает уродливое программирование отражения.

Ответ 7

@Wouter:

var query = from item in database.Items
select new Person
{
ID =item.id,
NAME= item.Name
};

где ID и NAME являются реальным свойством вашего класса Person.