Динамический vs var
Возможный дубликат:
В чем разница между динамическими (С# 4) и var?
В чем разница между ключевым словом dynamic и var в .NET 4.0 (VS 2010). В соответствии с MSDN определение динамического - динамический поиск позволяет вам писать вызовы метода, оператора и индексатора, свойства и обращения к полю и даже вызовы объектов, которые обходят обычную статическую привязку С# и вместо этого решают динамически.
В то время как определение для var является: неявно типизированная локальная переменная строго типизирована так же, как если бы вы объявили тип самостоятельно, но компилятор определяет тип.
Как это различается в контексте кода ниже:
var a1 = new A();
a1.Foo(1);
dynamic a2 = new A();
a2.Foo(1);
Ответы
Ответ 1
var
означает, что статический тип выведен - в вашем случае он точно эквивалентен
A a1 = new A();
Все привязки все еще выполняются полностью статически. Если вы посмотрите на сгенерированный код, он будет точно таким же, как с приведенным выше описанием.
dynamic
означает, что любое выражение с использованием a2
привязывается во время выполнения, а не во время компиляции, поэтому оно может вести себя динамически. Компилятор не проверяет, существует ли метод Foo
- поведение определяется во время выполнения. Действительно, если объект реализует IDynamicMetaObjectProvider
, он может решить, что делать с вызовом во время выполнения, отвечая на любой вызов метода (или другой вид использования) - другими словами, не обязательно быть "реальным", метод, называемый Foo
вообще.
Если вы посмотрите на сгенерированный код в динамической ситуации, вы обнаружите всевозможные странные и замечательные вещи, связанные с сайтами и связующими.
Ответ 2
var
безопасен по типу, поскольку он использует вывод типа.
Запись var a = new A();
является сокращением для A a = new A();
.
Переменная, которая объявлена dynamic
, НЕ безопасна, и компилятор ничего не делает, чтобы проверить, что методы, которые вы вызываете, существуют.
Ответ 3
В случае var
A() должен иметь во время компиляции метод .Foo(int)
.
В случае dynamic
это не так.