var
имеет статическую типизацию - компилятор и среда выполнения знают тип - они просто избавляют вас от набора текста ... следующие элементы идентичны на 100%:
var s = "abc";
Console.WriteLine(s.Length);
и
string s = "abc";
Console.WriteLine(s.Length);
Все, что произошло, это то, что компилятор выяснил, что s
должно быть строкой (из инициализатора). В обоих случаях он знает (в IL), что s.Length
означает свойство (instance) string.Length
.
dynamic
- очень зверь другой; он больше всего похож на объект
, но с динамической отправкой:
dynamic s = "abc";
Console.WriteLine(s.Length);
Здесь s
набирается как динамический . Он не знает о string.Length
, потому что не знает ничего о s
во время компиляции. Например, следующее также будет компилироваться (но не запускаться):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Во время выполнения (только) он проверяет свойство FlibbleBananaSnowball
- не находит его и взрывается в ливне искр.
С динамическим
, свойства / методы / операторы / и т.д. разрешаются во время выполнения , на основе фактического объекта. Очень удобно для общения с COM (который может иметь свойства только во время выполнения), DLR или другими динамическими системами, такими как javascript
.
Переменные, объявленные с помощью var , неявно, но статически типизированы. Переменные, объявленные с помощью dynamic , динамически типизируются. Эта возможность была добавлена в среду CLR для поддержки динамических языков, таких как Ruby и Python.
Я должен добавить, что это означает, что объявления dynamic разрешаются во время выполнения, var объявления разрешаются во время компиляции.
var
- это просто сокращение для обычного объявления типа, где вы позволяете компилятору угадывать правильный тип.
dynamic
- это новый (статический) тип, где все проверки выполняются во время выполнения, а не компилятором.
Тип переменной, объявленной с помощью var, определяется компилятором, это ярлык для указания имени типа, не более того.
Однако динамическое значение определяется во время выполнения, компилятор имеет нет представления о фактическом типе, и все обращения к методам / полям / свойствам с этой переменной будут выполняться во время выполнения.