2013-10-01 2 views
2

В чем разница между нормальными типами и анонимными типами в C# относительно процесса компиляции и управления памятью во время выполнения? Являются ли анонимные типы более эффективными, чем обычные типы?В чем разница между обычными типами и анонимными типами?

+1

Эффективность определяется как полученное значение, разделенное на потребляемые ресурсы. Какая ценность и какие ресурсы вам интересны? –

ответ

3

В чем разница между обычными типами и анонимными типами в C# относительно управления памятью во время выполнения? Являются ли анонимные типы более неэффективными, чем обычные типы?

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

В чем разница между обычными типами и анонимными типами в C# относительно процесса компиляции?

Я понятия не имею, что этот вопрос означает задавать.

+0

Спасибо, и извините за последний вопрос, он был слишком широк. Я имею в виду, что оба типа скомпилированы по-другому? возможно, выделяется больше или меньше памяти, чем другая? Или есть значительная стоимость для компилятора, чтобы попытаться выяснить, существует ли анонимный тип или нет, когда он используется? –

+1

@ guillegr123: Ну, подумайте, как разработчик компилятора. Согласно спецификации, вы должны уметь распознавать, когда «тот же» анонимный тип используется дважды в одной сборке, где под «тем же» мы подразумеваем, что число, типы и имена полей одинаковы, а в такой же заказ. Как бы вы реализовали код, который должен был отслеживать, совпадают ли два списка (тип, имя) пары или нет? –

+0

Спасибо. Таким образом, это означает, что анонимный тип может быть повторно использован в той же области, если он используется с тем же числом, типами и именами полей? Например: 'a = new {x = 1, y = 1}; b = new {x = 2, y = 3};' –

10

От MSDN: -

типов Anonymous обеспечивают удобный способ инкапсулировать набор только для чтения свойств в единый объект без первого явно определить тип. Имя типа генерируется компилятором и не доступно на уровне исходного кода. Тип свойств выводится компилятором.

Примечания:

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

+2

и могут быть назначены «динамическим», также они не могут оставить область, в которой они были созданы, если только они не назначены объекту или динамическому, однако, поскольку вы не можете отбросить его обратно из объекта, если вы хотите чтобы вернуть анонимный объект из функции, ваша функция должна возвращать динамический тип. – ohmusama

+3

@ohmusama: Ваше утверждение принято считать, но ложно. Рассмотрим функцию: статический T M (Func f) {return f(); } 'И теперь называем это: var anon = M (() => new {X = 1});' Функция M создает и возвращает объект анонимного типа, и вызывающий объект успешно сохраняет его в локальной переменной анонимного типа , поэтому ваше утверждение о том, что «они не могут оставить область, в которой они созданы, если они не преобразованы в объект или динамический», является ложным. –

+0

@EricLippert Хорошо, как мне его получить, если я создам его в функции, не передавая ее. Поскольку этот пример такой же, как и выражение «var anon = new {X = 1};' – ohmusama

Смежные вопросы