динамический vs var в C# [дубликат]


Возможные Дубликаты:
в чем разница между dynamic(C# 4) и var?

в чем разница между ключевым словом dynamic и var в .NET 4.0 (VS 2010). Согласно MSDN, определение динамического -динамический поиск позволяет записывать вызовы метода, оператора и индексатора, доступ к свойствам и полям и даже вызовы объектов, которые обходят обычную статическую привязку C# и вместо этого разрешаются динамически.

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

Как это отличается в контексте кода ниже:

var a1 = new A();
a1.Foo(1);

dynamic a2 = new A();
a2.Foo(1);
3 51

3 ответа:

var означает статический тип выводится - в вашем случае это точно эквивалентно

A a1 = new A();

все привязки по-прежнему делается полностью статически. Если вы посмотрите на сгенерированный код, он будет точно таким же, как и в приведенном выше объявлении.

dynamic означает, что все любое выражение с помощью a2 - это неизбежно во время выполнения, а не во время компиляции, поэтому он может вести себя динамично. Компилятор не будет проверять, является ли Foo метод существует-поведение определяется во время выполнения. Действительно, если объект реализует IDynamicMetaObjectProvider он может решить, что делать с вызовом во время выполнения, отвечая на любой вызов метода (или другой вид использования) - другими словами, не должно быть "реального" метода под названием Foo на всех.

если вы посмотрите на сгенерированный код в динамической ситуации, вы найдете все виды странных и замечательных вещей, чтобы сделать с Call-сайты и связующее вещество.

var является типобезопасным, поскольку он использует вывод типа. Пишу var a = new A(); это сокращение для A a = new A();. Переменная, которая объявлена dynamic не является безопасным типом, и компилятор ничего не делает, чтобы проверить, что методы, которые вы вызываете на нем существуют.

на var case, A () должен иметь .Foo(int) метод во время компиляции.

на dynamic случае, это не так.