Является ли новое "динамическое" ключевое слово С# 4.0 ключевым словом "var"?
Когда С# 4.0 выходит, и у нас есть динамическое ключевое слово, как описано в этом отличная презентация Андерса Хейлсберга, (С# развивается быстрее, чем я может не отставать.. У меня не было много времени, чтобы познакомиться с ключевым словом var)
Мне все еще нужно ключевое слово var? Есть ли что-то, что может сделать var.. эта динамика не может?
var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
Ответы
Ответ 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("/")
но когда он вызывает метод, который вам нужен, он может терпеть неудачу, потому что тип неправильный, и метода там нет.