Чем отличаются эти два определения переменных?
object oVar;
dynamic dVar;
Производительность? Выделение памяти? Преимущества?
Чем отличаются эти два определения переменных?
object oVar;
dynamic dVar;
Производительность? Выделение памяти? Преимущества?
Одна переменная набирается как object
компилятором, и все члены экземпляра будут проверяться как действительные компилятором. Другая переменная набирается как dynamic
, и все члены экземпляра будут проигнорированы компилятором и вызваны DLR во время выполнения.
Это не имеет никакого отношения ни к производительности, ни к распределению памяти. Тип dynamic
- это статический тип, который компилятор несколько игнорирует. Это дает вам возможность использовать duck typing на статически типизированном языке, который обеспечивает большую гибкость (особенно при работе с компонентами, написанными на языках, которые более динамичный).
Я бы определенно рекомендовал вам прочитать по следующим темам:
object
действителен для всех версий .NET.
Это базовый тип, наследуемый всеми другими типами, поэтому любой тип может быть добавлен в object
.
Вы не можете динамически добавлять и изменять что-либо в переменной, объявленной как object
.
Объявление статически типизировано и проверяется компилятором.
dynamic
является новым для .NET 4.0.
Он позволяет динамически добавлять и изменять свойства и методы без проверки их компилятором (поэтому, если вы написали не так, вы узнаете только во время выполнения).
В терминах распределения памяти - не большая разница. Оба являются ссылочными типами, и любой объект, назначенный или уже будет иметь память, выделенную для его хранения.
Что касается производительности, поскольку DLR задействован с dynamic
, то будут некоторые накладные расходы. Вам нужно будет протестировать и посмотреть.
Что касается других преимуществ - dynamic
действительно помогает с читабельностью при работе с динамическими объектами/данными, например с XML файлами. Это также помогает с отражением аналогичным образом.
Конечно, если вы хотите иметь динамические объекты, вы не можете использовать object
и использовать dynamic
.
Динамическое ключевое слово также добавляет некоторые накладные расходы к вашему времени выполнения из-за использования всей дополнительной логики - поэтому, если вам не нужна динамическая среда выполнения или взаимодействие, и вы можете избежать использования объекта, ваш код будет более эффективным.
Более подробную информацию о ключевом слове dynamic можно найти в книге Джеффа Рихтера: CLR через С#, 3rd Edition
Сэм Жантиль сделал несколько сообщений о деталях: