Новое «динамическое» ключевое слово C # 4.0 заменяет ключевое слово «var»? - PullRequest
27 голосов
/ 18 ноября 2008

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

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

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

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

Ответы [ 3 ]

72 голосов
/ 18 ноября 2008

Нет, они очень разные.

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

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

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

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

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

Ключевым моментом здесь является то, что «dynamic» не является безопасным типом и является операцией во время выполнения

1 голос
/ 18 ноября 2008

Да, вам все равно понадобится var:

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

Итак:

Var i = "Hello World"

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

i.Split("/")

Где как:

dynamic i = "Hello World"

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

i.Split("/")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...