Когда и зачем использовать анонимный класс вместо штуковин для простых объектов

В этом ответе я прочитал общий список анонимного класса, как загрузить список с анонимными объектами класса. Мой вопрос в том, почему и когда рекомендуется использовать этот способ вместо использования структуры, учитывая производительность и передовой опыт.


person user3223834    schedule 07.03.2014    source источник
comment
Я нашел два места, где я их часто использую: проекции Linq внутри одного метода и возврат данных JSON из действия Ajax MVC. Чуть не забыл - очень часто используются классы anon во вспомогательных словарях маршрутов MVC Html. msdn.microsoft.com/en-us/library /dd492936(v=vs.118).aspx   -  person asawyer    schedule 07.03.2014
comment


Ответы (2)


Структура открытого поля - это, по сути, группа переменных, связанных вместе изолентой. Он не будет вести себя как «объект», и его можно рассматривать как зло, если оно думает, что все должно вести себя как объект; тем не менее, в тех случаях, когда на самом деле нужен не объект, а скорее группа переменных, связанных вместе изолентой, структура открытого поля может идеально подойти.

Анонимные классы имеют лишь несколько преимуществ перед структурами открытого поля:

  • Синтаксис для их объявления, по крайней мере, немного меньше; в зависимости от стандартов кодирования он может быть намного меньше. Если стандарты кодирования позволяют написать internal struct WeightAndVolume { public double weight, volume;} и сказать, что структура "не требует пояснений" [она содержит два общедоступных поля типа double, с именами weight и volume, каждое из которых будет содержать все, что было записано в него последним внешним кодом] , анонимные классы не сэкономят много, но если стандарты кодирования потребуют, чтобы каждый именованный тип данных имел много страниц связанной документации, включая анализ необходимых процедур модульного тестирования, анонимные классы могли бы избежать таких хлопот.
  • Копирование ссылок на классы немного дешевле, чем копирование структур размером более 8 байт, хотя, если ссылка не будет копироваться много раз, стоимость создания объекта перевесит любую экономию на копировании.
  • Преобразование анонимного класса в Object намного дешевле, чем преобразование структуры. При первом приведении экземпляра анонимного класса в Object дополнительные затраты на его создание будут возмещены. Каждый дополнительный раз будет означать экономию этой суммы.
  • Передача структуры универсальному методу потребует от JITter создания специализированной версии кода для этого типа; напротив, JITter должен был бы создать только один фрагмент кода для обработки всех анонимных классов.

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

person supercat    schedule 07.03.2014
comment
Я согласен с тем, что структура не ведет себя или не имеет всего необходимого для поведения объекта, однако это упоминается в link Объявление класса или структуры похоже на план, который используется для создания экземпляров или объектов во время выполнения. Я ценю подробности об анонимных классах, я многого не знал, и в некоторых случаях они кажутся весьма удобными, как упоминалось выше. - person user3223834; 08.03.2014

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

  1. это одноразовая работа, для которой создание правильного именованного типа было бы обременительным, и
  2. потребителем объектов является либо код, сгенерированный компилятором (у вас нет доступа к типам, поддерживающим эти анонимные классы, но компилятор имеет), либо использует отражение (в этом случае вам не нужен доступ к типам во время компиляции )

Чаще всего это происходит в запросах LINQ.

person Jon    schedule 07.03.2014