Использование неявно типизированных локальных переменных [дублировать]

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

Вопрос

На этот вопрос уже есть ответ здесь:

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

public string SomeMethod(int aParam)
{
    int aNumber = SomeOtherMethod(aParam);
    // should be changed to:
    var aNumber = SomeOtherMethod(aParam);
}

Я думаю, что явно типизированные переменные более удобочитаемы (более явны).

Что вы думаете о предложении ReSharper?Есть ли какое-либо преимущество в использовании неявно типизированных переменных?Когда вы используете неявные / эксплицитные переменные?

Это было полезно?

Решение

Лично я использую “var” только тогда, когда могу четко различить тип переменной, просто прочитав объявление, например:

var someVariable = new List<int>();

В приведенном выше примере очевидно, что “var” относится к “Списку<int>”.

Мне не нравится использовать “var”, когда мне нужно перейти к определению какого-либо метода, чтобы выяснить, какой тип переменной представляет “var”, или полагаться на visual studio intelli-popup или что бы это ни называлось, например, это для меня не нормально:

var someVaraible = SomeMethod();

Я имею в виду, что должна возвращать функция “someMethod”?Можете ли вы сказать, просто взглянув на строку кода?Нет, вы не можете, вот почему я избегаю использовать “var” в таких ситуациях.

Другие советы

По этому поводу много дискуссий, но я думаю, что все зависит от личного вкуса, точно так же, как использование ключевого слова "this" почти везде.

Я лично предпочитайте явно типизированные переменные, но при использовании вложенных универсальных коллекций все может стать более читаемым с использованием неявно типизированной переменной.Посмотрите на:

Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>();

против:

var myDictionary = new Dictionary<string, Dictionary<string, string>>();

Редактировать:этот раздел SO охватывает ту же тему, с несколькими приятными ответами: Что использовать:var или тип имени объекта?

РЕДАКТИРОВАТЬ 2:Много работая с async в настоящее время, я обнаружил, что использование явно типизированных переменных иногда может предотвратить неприятные ошибки.Рассмотрим этот глупый пример, в котором вы хотели бы вернуть идентификатор пользователя.Также учтите , что GetUserAsync возвращает Task<User>.Если вы используете неявно типизированные переменные, то в конечном итоге вы будете использовать что-то вроде этого:

public long GetUserId()
{
  var user = GetUserAsync();
  return user.Id;
}

Это компилируется, но это неправильно."пользователь" на самом деле является Task<User>.И он компилируется как Task также имеет Id собственность.В этом случае можно было бы случайно вернуть идентификатор Задачи вместо Пользователя.

public long GetUserId()
{
  User user = GetUserAsync();
  return user.Id;
}

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

На самом деле однажды со мной такое случилось :-)

На всякий случай, если кто-то еще не заметил, вы можете легко изменить “предложения” в Reshaper (Reshaper -> Options -> Languages -> Context Actions -> “Заменить явную спецификацию типа на ‘var’”).

Лично я предпочитаю везде иметь явные спецификации типов, но я не слишком привередлив по этому поводу.

Просто иногда проще ввести псевдоключевое слово var, чем огромное имя типа, особенно если может быть задействовано универсальное.Однако вы должны знать, что они функционально идентичны.В любом случае нет никакой разницы в производительности или чего-то еще.Компилятор выводит тип правой части присваивания и заменяет var этим типом.Это не происходит во время выполнения, как в варианте VB.

FWIW, ключевое слово var во многих случаях легко читается.Особенно, если...

  1. Правая часть присваивания представляет собой выражение конструктора.

    переменная карта = новый словарь>();

  2. Локальные переменные имеют хорошие имена.

HTH

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