Подтвердить что ты не робот

Является ли новое "динамическое" ключевое слово С# 4.0 ключевым словом "var"?

Когда С# 4.0 выходит, и у нас есть динамическое ключевое слово, как описано в этом отличная презентация Андерса Хейлсберга, (С# развивается быстрее, чем я может не отставать.. У меня не было много времени, чтобы познакомиться с ключевым словом var)

Мне все еще нужно ключевое слово var? Есть ли что-то, что может сделать var.. эта динамика не может?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
4b9b3361

Ответ 1

Нет, они совсем разные.

var означает "вывести тип переменной во время компиляции", но он все еще полностью статически связан.

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

Я ожидаю использовать dynamic очень редко - только когда мне действительно нужно динамическое поведение:

  • var позволяет улавливать опечатки и т.д. во время компиляции
  • статически связанный код всегда будет работать быстрее, чем динамически связанный код (даже если разница становится достаточно малой)
  • статически связанный код дает больше поддержки времени компиляции за пределами только ошибок: вы можете найти иерархии вызовов, рефакторинг будет работать лучше, Intellisense доступен и т.д.

Ответ 2

Динамические и var представляют две совершенно разные идеи.

вар

Var по существу просит компилятора выяснить тип переменной на основе выражения в правой части оператора присваивания. Затем переменная обрабатывается точно так, как если бы она была явно объявлена ​​как тип выражения. Например, следующие два утверждения эквивалентны

var a = "foo";
string a = "foo";

Ключ, который нужно убрать, заключается в том, что "var" безопасен на 100% и является операцией времени компиляции

динамический

Динамика во многом противоположна var. Использование динамики существенно устраняет всю безопасность типов для конкретной переменной. Это не так, как у него нет. Когда вы вызываете метод или поле переменной, определение того, как вызвать это поле, происходит во время выполнения. Например

dynamic d = SomeOperation();
d.Foo(); // Will this fail or not?  Won't know until you run the program

Ключ, который нужно убрать, заключается в том, что "динамический" не является безопасным по типу и является операцией времени выполнения

Ответ 3

Да вам все равно потребуется var:

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

Итак:

Var i = "Hello World"

будет иметь свой тип, выведенный как строковый тип, при этом intellisence предоставит вам все методы, которые может использовать строка, например,

i.Split("/")

Где как:

dynamic i = "Hello World"

не будет выводить его тип до тех пор, пока компилятор не знает, какого типа он еще, но все равно позволит вам:

i.Split("/")

но когда он вызывает метод, который вам нужен, он может терпеть неудачу, потому что тип неправильный, и метода там нет.