В этом ответе я прочитал общий список анонимного класса, как загрузить список с анонимными объектами класса. Мой вопрос в том, почему и когда рекомендуется использовать этот способ вместо использования структуры, учитывая производительность и передовой опыт.
Когда и зачем использовать анонимный класс вместо штуковин для простых объектов
Ответы (2)
Структура открытого поля - это, по сути, группа переменных, связанных вместе изолентой. Он не будет вести себя как «объект», и его можно рассматривать как зло, если оно думает, что все должно вести себя как объект; тем не менее, в тех случаях, когда на самом деле нужен не объект, а скорее группа переменных, связанных вместе изолентой, структура открытого поля может идеально подойти.
Анонимные классы имеют лишь несколько преимуществ перед структурами открытого поля:
- Синтаксис для их объявления, по крайней мере, немного меньше; в зависимости от стандартов кодирования он может быть намного меньше. Если стандарты кодирования позволяют написать
internal struct WeightAndVolume { public double weight, volume;}
и сказать, что структура "не требует пояснений" [она содержит два общедоступных поля типаdouble
, с именамиweight
иvolume
, каждое из которых будет содержать все, что было записано в него последним внешним кодом] , анонимные классы не сэкономят много, но если стандарты кодирования потребуют, чтобы каждый именованный тип данных имел много страниц связанной документации, включая анализ необходимых процедур модульного тестирования, анонимные классы могли бы избежать таких хлопот. - Копирование ссылок на классы немного дешевле, чем копирование структур размером более 8 байт, хотя, если ссылка не будет копироваться много раз, стоимость создания объекта перевесит любую экономию на копировании.
- Преобразование анонимного класса в
Object
намного дешевле, чем преобразование структуры. При первом приведении экземпляра анонимного класса вObject
дополнительные затраты на его создание будут возмещены. Каждый дополнительный раз будет означать экономию этой суммы. - Передача структуры универсальному методу потребует от JITter создания специализированной версии кода для этого типа; напротив, JITter должен был бы создать только один фрагмент кода для обработки всех анонимных классов.
В общем, структуры работают лучше, чем анонимные классы. С другой стороны, есть несколько сценариев (в основном связанных с третьим пунктом выше), когда классы могут оказаться намного лучше.
Я бы не сказал, что когда-либо рекомендуется использовать анонимные классы, в том смысле, что никогда не будет неправильным не использовать их. Но обычно к ним привыкают, когда
- это одноразовая работа, для которой создание правильного именованного типа было бы обременительным, и
- потребителем объектов является либо код, сгенерированный компилятором (у вас нет доступа к типам, поддерживающим эти анонимные классы, но компилятор имеет), либо использует отражение (в этом случае вам не нужен доступ к типам во время компиляции )
Чаще всего это происходит в запросах LINQ.