динамический vs var в C #

Возможный дубликат:
В чем разница между динамическим (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);

person Bhaskar    schedule 17.12.2009    source источник
comment
См. stackoverflow.com / questions / 961581 /   -  person Crescent Fresh    schedule 17.12.2009


Ответы (3)


var означает, что предполагается тип static - в вашем случае он точно эквивалентен

A a1 = new A();

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

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

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

person Jon Skeet    schedule 17.12.2009

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

person Klaus Byskov Pedersen    schedule 17.12.2009

В случае var на A () во время компиляции должен быть включен метод .Foo(int).

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

person Oded    schedule 17.12.2009