Зачем использовать динамическую типизацию в C #? - PullRequest
8 голосов
/ 06 сентября 2010

Сначала я подумал что-то вроде:

var aName=getAllSomethings();

Очень нечитабельно, поэтому я буду использовать динамическую типизацию, когда нет места для путаницы, например:

AClassName aName = new AClassName();

Здесь

var aName=new AClassName();

кажется читабельным. Но потом я прочитал ( здесь ), что динамическая типизация также имеет свою цену.
Я попытался прочитать все остальные посты в этой ссылке, чтобы понять, где я должен использовать динамическую типизацию, но не смог найти ни одной веской причины. Стоит ли ждать, когда я скажу себе: «Это можно решить только с помощью динамической типизации»? Или есть лучшие (практические) причины для его использования?

Спасибо.

Редактировать: Моя ошибка (-: закрыть этот вопрос как можно скорее.

Ответы [ 6 ]

26 голосов
/ 06 сентября 2010

var не динамическая печать. Просто тип aName определяется компилятором.

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

Теперь в C # 4 существует динамическая типизация , но она будет записана как:

dynamic aName = new AClassName();

Мое личное убеждение в том, что динамическая типизация будет относительно редко полезной в C # 4 - в основном, когда вы имеете дело с данными, которые уже известны только динамически, например, отражение или навигация по XML.

6 голосов
/ 06 сентября 2010

Это не динамическая типизация. var объявляет статический тип, известный во время компиляции, и он будет абсолютно эквивалентен объявлению имени типа. Компилятор выведет тип и заменит его в полученной сборке.

5 голосов
/ 06 сентября 2010

Использование ключевого слова var не является динамической типизацией.Ключевое слово var обрабатывается компилятором.Переменная получает статическую типизацию на основе первого присваивания переменной.

Тип:

 var value = new StringBuilder();

Is StringBuilder.Нет никакого способа изменить этот тип (что позволяет динамическая типизация).

То, на что ссылается Джон Скит в своем блоге, это ключевое слово dynamic.Это совсем другой зверь.

2 голосов
/ 06 сентября 2010

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

Я использую var, когда думаю, что это имеет смысл; а именно, когда тип очевиден и он сокращает детализацию объявления:

var someDict = new Dictionary<string, int>();

Вместо ...

Dictionary<string, int>() someDict = new Dictionary<string, int>();

Однако, в вашем примере здесь:

var aName=getAllSomethings();

Я бы не использовал 'var', потому что, как вы уже заметили, вам необходимо проверить тип возвращаемого значения 'getAllSomethings ()' (плохой стиль именования для C # BTW), чтобы узнать, что такое aName , что просто делает код менее читабельным.

2 голосов
/ 06 сентября 2010

Вы неправильно понимаете, почему используется динамическая типизация.

"var" использует вывод типа, чтобы определить во время компиляции тип переменной. Этот механизм довольно прост и абсолютно не влияет на производительность. Переменная, объявленная с помощью «var», может по-прежнему иметь только один точный тип (или производные этого типа).

Динамические переменные позволяют переменной содержать любой тип во время выполнения и по-прежнему выполнять операции над этим объектом, как будто мы знаем, что поддерживается. Каждый из этих вызовов заставляет среду выполнения выполнить проверку, чтобы убедиться, что вызов метода действительно поддерживается. Это часть того, почему динамическая типизация имеет накладные расходы во время выполнения.

2 голосов
/ 06 сентября 2010

Это не динамическая типизация.Динамическая типизация осуществляется через «динамический» тип (как ни странно).Использование var не имеет никаких накладных расходов, это сокращенная кодировка, которая по-прежнему создает строго типизированные переменные.

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