var
имеет статическую типизацию - компилятор и среда выполнения знают тип - они просто экономят время при наборе текста ... следующие данные идентичны на 100%:
var s = "abc";
Console.WriteLine(s.Length);
и
string s = "abc";
Console.WriteLine(s.Length);
Все, что произошло, было то, что компилятор выяснил, что это s
должна быть строка (из инициализатора). В обоих случаях он знает (в IL), что s.Length
означает string.Length
свойство (instance) .
dynamic
это совсем другой зверь; это наиболее похоже на object
, но с динамической отправкой:
dynamic s = "abc";
Console.WriteLine(s.Length);
Здесь s
напечатан как динамический . Он не знает о том string.Length
, потому что он не знает ничего о s
во время компиляции. Например, следующее будет компилироваться (но не запускаться) тоже:
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Во время выполнения (только), было бы проверить на FlibbleBananaSnowball
собственность - не найти ее, и взрываются в сноп искр.
При этом dynamic
свойства / методы / операторы / и т. Д. Разрешаются во время выполнения на основе фактического объекта. Очень удобно для общения с COM (который может иметь свойства только для времени выполнения), DLR или другими динамическими системами, например javascript
.
var
могут выводить типы, которые могут быть нежелательными из-за подтипов и неявных приведений. То есть,var
возможно, разрешен тип, статически отличающийся от ожидаемого, когда происходит неявное приведение (особенно к более общему типу, но это не ограничивается этим). Тривиальный примерobject x = ""
противvar x = ""
противvar x = "" as object
, но и другие более хитрые (и реалистические) случаи могут иметь место и могут вызвать тонкие ошибки.WriteLine
вызывать. Это «связывание» происходит во время компиляции. В случае сdynamic
типом.Length
тоже должен бытьdynamic
, и только во время выполнения решается, какая перегрузка (если вообще имеется)WriteLine
подходит лучше всего. Связывание происходит во время выполнения.var
ключевое слово в Visual Studio отображается фактический тип, который выводится. Показывает, что тип известен во время компиляции.Переменные, объявленные с помощью var , неявно, но статически типизированы. Переменные, объявленные с динамическим , типизируются динамически. Эта возможность была добавлена в CLR для поддержки динамических языков, таких как Ruby и Python.
Я должен добавить, что это означает, что динамические объявления разрешаются во время выполнения, объявления var разрешаются во время компиляции.
источник
Я собираюсь объяснить разницу между динамическим и вар .
Это будет работать Компилятор может воссоздать тип динамической переменной.
сначала он создает тип как целое число, а после этого компилятор воссоздает тип как строку,
но в случае с var
источник
var подразумевает, что применяется статическая проверка типов (раннее связывание). Динамический подразумевает, что применяется динамическая проверка типов (позднее связывание). С точки зрения кода, учитывайте следующее:
Если вы скомпилируете это и проверите результаты с помощью ILSpy, вы обнаружите, что компилятор добавил некоторый код поздней привязки, который будет обрабатывать вызов Hello () из b, тогда как ранняя привязка была применена к a, a может вызвать Hello () напрямую.
например (разборка ILSpy)
Лучшее, что вы можете сделать, чтобы обнаружить разницу, это написать себе небольшое консольное приложение, подобное этому, и протестировать его самостоятельно с помощью ILSpy.
источник
Одно большое отличие - вы можете иметь динамический тип возврата.
источник
Вот простой пример, который демонстрирует разницу между Dynamic (4.0) и Var
Шива Мамиди
источник
**
символов в примере кода предназначено только для обозначения акцента и не является частью реального рабочего кода.var
это просто сокращение для обычного объявления типа, где вы позволяете компилятору угадать правильный тип.dynamic
это новый (статический) тип, где все проверки выполняются во время выполнения, а не компилятором.источник
Тип переменной, объявленной с помощью var, определяется компилятором, это ярлык для указания имени типа, не более того.
Однако динамический определяется во время выполнения, компилятор не имеет представления о фактическом типе, и все обращения к методу / полю / свойству с этой переменной будут выполняться во время выполнения.
источник
Это хорошее видео на YouTube, в котором рассказывается о
var
VSDynamic
с практической демонстрацией.Ниже приведено более подробное объяснение со снимком.
Var - раннее связывание (статическая проверка), в то время как динамическое - позднее связывание (динамическая оценка).
Ключевое слово var просматривает ваши данные с правой стороны, а затем во время компиляции определяет тип данных с левой стороны. Другими словами, ключевое слово var просто спасает вас от набора множества вещей. Посмотрите на изображение ниже, где, когда мы дали строковые данные, а переменная x показывает строковый тип данных в моей подсказке.
С другой стороны, динамическое ключевое слово для совершенно другой цели. Динамические объекты оцениваются во время выполнения. Например, в приведенном ниже коде свойство «Длина» существует или не оценивается во время выполнения. Я специально набрал маленькую букву «l», поэтому эта программа скомпилировалась нормально, но при ее фактическом выполнении выдает ошибку, когда свойство «длина» был назван (МАЛЕНЬКИЕ "Я").
источник
Динамическая переменная и переменная var могут хранить значения любого типа, но для их инициализации требуется переменная во время объявления.
Компилятор не имеет никакой информации о «динамическом» типе переменной. var безопасен для компилятора, т.е. компилятор имеет всю информацию о сохраненном значении, поэтому он не вызывает проблем во время выполнения.
Динамический тип может быть передан в качестве аргумента функции, а функция также может его вернуть. Тип var не может быть передан в качестве аргумента функции, а функция не может возвращать тип объекта. Переменная этого типа может работать в той области, где она определена.
В случае динамического приведения не требуется, но вам нужно знать свойство и методы, относящиеся к хранимому типу, тогда как для var нет необходимости в приведении, потому что компилятор имеет всю информацию для выполнения операции.
динамический: полезно при кодировании с использованием отражения или поддержки динамического языка или с объектами COM, потому что нам требуется писать меньше кода.
var: полезно при получении результата из запросов linq. В 3.5 Framework он введен для поддержки функции linq.
Ссылка: консультирование
источник
источник
Не путайте динамические и вар. Объявление локальной переменной с помощью var - это всего лишь синтаксический ярлык, в котором компилятор выводит определенный тип данных из выражения. Ключевое слово var может использоваться только для объявления локальных переменных внутри метода, в то время как динамическое ключевое слово может использоваться для локальных переменных, полей и аргументов. Вы не можете преобразовать выражение в var, но вы можете преобразовать выражение в динамическое. Вы должны явно инициализировать переменную, объявленную с использованием var, тогда как вам не нужно инициализировать переменную, объявленную с помощью dynamic.
источник
Пример:
Но в динамическом типе базовый тип определяется только во время выполнения. Динамический тип данных не проверяется во время компиляции, а также не является строго типизированным. Мы можем назначить любое начальное значение для динамического типа, а затем его можно переназначить любому новому ценность в течение всей жизни.
Пример:
Он также не обеспечивает поддержку IntelliSense. Он не дает лучшей поддержки, когда мы также предоставляем работу с linq. Потому что он не поддерживает лямбда-выражения, методы расширения и анонимные методы.
источник
Вот отличия
var статически типизирован (время компиляции), динамически типизирован (время выполнения)
Переменная, объявленная как var, может использоваться только локально, динамические переменные могут передаваться в качестве параметров функции (сигнатура функции может определять параметр как динамический, но не var).
При динамическом разрешении свойств происходит во время выполнения, и это не относится к var, что означает, что во время компиляции любая переменная, объявленная как динамическая, может вызывать метод, который может существовать или не существовать, и поэтому компилятор не будет выдавать ошибку.
Приведение типов с помощью var невозможно, но возможно с помощью динамического (вы можете привести объект как динамический, но не как var).
Арун Виджайрагхаван
источник