Чем отличаются эти два определения переменных?
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
Сэм Жантиль сделал несколько сообщений о деталях: