Каково различие между динамическим (C# 4) и var?

4 ответа

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 .

442
ответ дан 23 November 2019 в 05:29
поделиться

Переменные, объявленные с помощью var , неявно, но статически типизированы. Переменные, объявленные с помощью dynamic , динамически типизируются. Эта возможность была добавлена ​​в среду CLR для поддержки динамических языков, таких как Ruby и Python.

Я должен добавить, что это означает, что объявления dynamic разрешаются во время выполнения, var объявления разрешаются во время компиляции.

56
ответ дан 23 November 2019 в 05:29
поделиться

var - это просто сокращение для обычного объявления типа, где вы позволяете компилятору угадывать правильный тип.

dynamic - это новый (статический) тип, где все проверки выполняются во время выполнения, а не компилятором.

7
ответ дан 23 November 2019 в 05:29
поделиться

Тип переменной, объявленной с помощью var, определяется компилятором, это ярлык для указания имени типа, не более того.

Однако динамическое значение определяется во время выполнения, компилятор имеет нет представления о фактическом типе, и все обращения к методам / полям / свойствам с этой переменной будут выполняться во время выполнения.

4
ответ дан 23 November 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: