Использование типа "var" в объявлении переменной - PullRequest
37 голосов
/ 07 сентября 2010

Наш внутренний аудит предлагает нам использовать явное объявление типа переменной вместо ключевого слова var. Они утверждают, что использование var «в некоторых случаях может привести к неожиданным результатам».

Мне не известно о каких-либо различиях между явным объявлением типа и использованием var после компиляции кода в MSIL.

Аудитор - уважаемый профессионал, поэтому я не могу просто отказаться от такого предложения.

Ответы [ 18 ]

1 голос
/ 08 сентября 2010

Я использую var только в тех случаях, когда ясно, к какому типу относится переменная или когда вообще не нужно знать тип (например, GetPerson () должен возвращать Person, Person_Class и т. Д.).

Я не использую var для примитивных типов, enum и string. Я также не использую его для типа значения, потому что тип значения будет скопирован присваиванием, поэтому тип переменной должен быть объявлен явно.

По поводу ваших комментариев аудитора, я бы сказал, что добавление большего количества строк кода, как мы это делаем каждый день, также "приводит к неожиданным результатам в некоторых случаях" . Этот аргумент достоверности имеет уже доказано теми ошибками, которые мы создали, поэтому я бы предложил навсегда заморозить кодовую базу, чтобы предотвратить это.

0 голосов
/ 07 сентября 2012

Использование var может скрыть ошибки логического программирования, в противном случае вы получите предупреждение от компилятора или IDE.См. Этот пример:

float distX = innerDiagramRect.Size.Width / (numObjInWidth + 1);

Здесь все типы в расчете: int, и вы получаете предупреждение о возможной потере дроби, потому что вы получаете результат в переменной float.

Использование var:

var distX = innerDiagramRect.Size.Width / (numObjInWidth + 1);

Здесь вы не получите предупреждения, поскольку тип distX скомпилирован как int.Если вы намеревались использовать значения с плавающей запятой, это логическая ошибка, которая скрыта для вас, и ее трудно обнаружить при выполнении, если только она не вызовет исключение divide by zero в более позднем вычислении, если результат этого начального вычисления <1.*

0 голосов
/ 10 сентября 2010

var скомпилируется с тем же типом, что и статический тип, который может быть указан.Это просто устраняет необходимость явного указания этого типа в вашем коде.Это не динамический тип и не может / не может изменяться во время выполнения.Я нахожу это очень полезным для использования в циклах foreach.

foreach(var item in items)
{
item.name = ______;
}

При работе с перечислениями несколько раз определенный тип неизвестен по времени поиска.Использование var вместо Static Type приведет к тому же результату.Я также обнаружил, что использование var упрощает рефакторинг.Когда используется перечисление другого типа, foreach обновлять не нужно.

0 голосов
/ 08 сентября 2010

Я также думаю, что у вас возникнут проблемы, если вы объявите свои двойники без D на конце.когда вы компилируете версию выпуска, ваш компилятор, скорее всего, уберет двойные и сделает их плавающими для экономии места, поскольку он не будет учитывать вашу точность.

0 голосов
/ 07 сентября 2010

используя var ленивый код, если вы знаете, какой тип будет. Его легче и чище читать. Если смотреть на много-много кода, проще и чище всегда лучше

0 голосов
/ 07 сентября 2010

Нет абсолютно никакой разницы в выходных данных IL для объявления переменной, использующей var, и для одного явно указанного (вы можете доказать это, используя отражатель).Обычно я использую var только для длинных вложенных универсальных типов, циклов foreach и анонимных типов, так как мне нравится, когда все явно указано.У других могут быть разные предпочтения.

0 голосов
/ 07 сентября 2010

var - это сокращенное обозначение использования явного объявления типа.

Вы можете использовать var только в определенных обстоятельствах;Вам нужно будет инициализировать переменную во время объявления при использовании var.Вы не можете присвоить переменную другого типа впоследствии.

Мне кажется, что многие люди путают ключевое слово var с типом данных Variant в VB6.

0 голосов
/ 07 сентября 2010

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

...