Является ли новое ключевое слово «динамический» C# 4.0 устаревшим ключевым словом «var»?

StackOverflow https://stackoverflow.com/questions/298277

  •  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("/")

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top