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

StackOverflow https://stackoverflow.com/questions/48668

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Например:

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

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

Никого не волнует анонимный тип.Он существует, поэтому вам не нужно объявлять другой класс.

Другие советы

Из 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);

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

Этот запрос

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

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

SELECT Column1, Column2 AS Alias2 FROM Table1

Используя анонимные типы, вы можете создавать специальные прогнозы, не определяя для них тип заранее.Компилятор определит тип за вас.

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

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

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

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

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

@Воутер:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top