Является ли новое ключевое слово «динамический» C# 4.0 устаревшим ключевым словом «var»?
-
08-07-2019 - |
Вопрос
Когда выйдет C# 4.0 и у нас будет ключевое слово Dynamic, как описано в этом отличная презентация Андерса Хейлсберга, (C# развивается быстрее, чем я успеваю..У меня не было много времени, чтобы ознакомиться с ключевым словом var)
Понадобится ли мне ключевое слово var?Есть ли что-нибудь, что может сделать var..эта динамика не может?
var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
Решение
Нет, они очень разные.
var
означает «определить тип переменной во время компиляции», но она по-прежнему полностью статически привязана.
dynamic
означает «предположим, что я могу делать с этой переменной все, что захочу», т.е.компилятор не знает, какие операции доступны, и DLR определит, какие вызовы Действительно означает во время выполнения.
Я ожидаю использовать dynamic
очень редко - только тогда, когда мне действительно нужно динамическое поведение:
var
позволяет обнаруживать опечатки и т. д. во время компиляции- статически связанный код всегда будет работать быстрее, чем динамически связанный код (даже если разница станет достаточно небольшой)
- статически связанный код обеспечивает большую поддержку во время компиляции, помимо ошибок:вы можете найти иерархии вызовов, рефакторинг будет работать лучше, доступен Intellisense и т. д.
Другие советы
Dynamic и var представляют собой две совершенно разные идеи.
вар
По сути, Var просит компилятор определить тип переменной на основе выражения в правой части оператора присваивания.Затем переменная обрабатывается точно так же, как если бы она была явно объявлена как тип выражения.Например, следующие два утверждения эквивалентны
var a = "foo";
string a = "foo";
Ключевым моментом здесь является то, что «var» на 100% безопасен по типам и является операцией времени компиляции.
динамичный
Dynamic во многих отношениях является полной противоположностью var.Использование динамики по существу устраняет всю безопасность типов для конкретной переменной.Во многих отношениях у него нет типа.Когда вы вызываете метод или поле для переменной, определение того, как вызвать это поле, происходит во время выполнения.Например
dynamic d = SomeOperation();
d.Foo(); // Will this fail or not? Won't know until you run the program
Ключевым моментом здесь является то, что «динамический» не является типобезопасным и является операцией во время выполнения.
Да, вам все равно понадобится var:
Вар это переменная тип которого будет определен компилятором.
динамичный будет иметь тип, назначенный во время выполнения
Так:
Var i = "Hello World"
его тип будет выведен как строковый, при этом интеллект предоставит вам все методы, которые может использовать строка, например:
i.Split("/")
Тогда как:
dynamic i = "Hello World"
его тип не будет выведен до времени выполнения, поскольку компилятор еще не знает, какой это тип, но все равно позволит вам это сделать:
i.Split("/")
но когда он вызывает нужный вам метод, он может потерпеть неудачу, потому что тип неправильный, а метода нет.