Как использовать анонимные типы в С#?
Я видел множество описаний, как работают анонимные типы, но я не уверен, насколько они действительно полезны. Каковы некоторые сценарии, которые анонимные типы могут использоваться для решения в хорошо продуманной программе?
Ответы
Ответ 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.