Как использовать анонимные типы в C #? - PullRequest
15 голосов
/ 07 сентября 2008

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

Ответы [ 7 ]

18 голосов
/ 07 сентября 2008

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

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

Например:

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, анонимного типа. Это там, так что вам не нужно объявлять другой класс.

8 голосов
/ 07 сентября 2008

Из 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);
2 голосов
/ 03 октября 2008

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

Этот запрос

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

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

SELECT Column1, Column2 AS Alias2 FROM Table1

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

1 голос
/ 07 сентября 2008

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

1 голос
/ 07 сентября 2008

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

0 голосов
/ 20 мая 2009

@ Wouter:

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

, где ID и NAME являются собственностью вашего класса Person.

0 голосов
/ 03 октября 2008

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

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

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

...