Почему бы var быть плохой вещью? - PullRequest
47 голосов
/ 13 февраля 2009

Я разговаривал со своими коллегами на днях и услышал, что их стандарт кодирования явно запрещает им использовать ключевое слово var в C #. Они понятия не имели, почему это так, и я всегда считал, что неявное объявление невероятно полезно при кодировании. У меня никогда не возникало проблем с определением типа переменной (вы только наведите курсор мыши на переменную в VS, и вы получите тип таким образом).

Кто-нибудь знает, почему было бы плохой идеей использовать ключевое слово var в C #?

Ответы [ 17 ]

3 голосов
/ 09 сентября 2014

Вы можете посчитать мнение Microsoft актуальным, поскольку C # является их языком:

"Тем не менее, использование var имеет, по крайней мере, потенциал для того, чтобы сделать ваш код более трудным для понимания другими разработчиками. По этой причине в документации C # обычно используется var только когда это требуется. "

См. MSDN - неявно типизированные локальные переменные (Руководство по программированию в C #) , последний абзац.


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

var x = "mistake";     // error not found by compiler
int x = "mistake";     // error found

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

Это делает ваш код уязвимым для случайных изменений, например сделанные инструментами слияния или уставшими разработчиками.

2 голосов
/ 23 января 2013

Эрик Липперт хорошо подводит итог :

  • Используйте var, когда вам нужно; когда вы используете анонимные типы.
  • Используйте var, когда тип объявления очевиден из инициализатора, особенно если это создание объекта. Это устраняет избыточность.
  • Рассмотрите возможность использования var, если код подчеркивает семантическое «бизнес-назначение» переменной и преуменьшает «механические» детали ее хранения.
  • Используйте явные типы, если это необходимо для правильного понимания и поддержки кода.
  • Используйте описательные имена переменных независимо от того, используете ли вы «var». Имена переменных должны представлять семантику переменной, а не детали ее хранения; "decimalRate" - это плохо; "InterestRate" это хорошо.

Мое собственное мнение: мне труднее читать и немного бессмысленно с такими типами, как int, string, bool или даже User. В конце концов, речь идет о удобочитаемости (за исключением случаев, когда он используется с LINQ), поэтому, когда переменные разбрызганы, их может быть сложнее прочитать и победить назначение ключевого слова, для которого разработчики языка предназначали его.

2 голосов
/ 13 февраля 2009

От Отдел декларации Отдел резервирования (от Джеффа Код ужасов ):

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

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

2 голосов
/ 13 февраля 2009

Неявная типизация великолепна, и люди, которые категорически запрещают ее, наносят ущерб производительности и предлагают хрупкий код.

Это почти как безопасная типизированная, проверенная компилятором утка, которая невероятно полезна при рефакторинге. Например, если у меня есть метод, который возвращает List, и я реорганизую его, чтобы он возвращал IEnumerable, то все вызывающие в этот метод, которые использовали ключевое слово var и используют только методы IEnumerable, будут в порядке. Если я явно указал, например, List, то мне нужно пойти и изменить его на IEnumerable везде.

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

1 голос
/ 13 февраля 2009

У меня были случаи (когда я просматривал коллекцию Table.Rows), когда использование var приводило к типу некоторого базового класса, а не к фактическому типу DataRow. Это единственный раз, когда у меня были проблемы с вар.

0 голосов
/ 17 июня 2016

'var' означает ясность

Основная дискуссия о том, следует ли использовать ключевое слово var или нет, связана с тем, насколько читабелен код для вас и других разработчиков.

Так же, как если бы вы писали историю, нет однозначного правильного ответа. Но давайте рассмотрим некоторые примеры этого на простом английском языке.

Джейк поздоровался с Биллом. Он ему не понравился, поэтому он повернулся и пошел другим путем.

Кто пошел другим путем? Джейк или Билл? В этом случае «Джейк» и «Билл» похожи на имя типа. И «он» и «он» похожи на ключевое слово var. В этом случае это может помочь быть более конкретным. Следующее, например, гораздо понятнее.

Джейк поздоровался с Биллом. Джейку не понравился Билл, поэтому он повернулся и пошел другим путем.

В этом конкретном случае предложение стало более понятным. Но это не всегда будет так. В некоторых случаях конкретность затрудняет чтение.

Биллу нравятся книги, поэтому Билл пошел в библиотеку, а Билл достал книгу, которая всегда нравилась Биллу.

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

Биллу нравятся книги, поэтому он пошел в библиотеку и достал книгу, которая ему всегда нравилась.

Эти аналогии охватывают суть, но они не рассказывают всю историю. Видите, в этих примерах был только один способ обратиться к человеку. Или с их именем, например, Биллом, или более общим способом, как «он» и «он». Но мы работаем только с одним словом.

В случае кода у вас есть два «слова», тип и имя переменной.

Person p = GetPerson();

Теперь возникает вопрос: достаточно ли информации, чтобы вы могли легко определить, что такое p? Вы все еще знаете, что люди в этом сценарии:

var p = GetPerson();

Как насчет этого:

var p = Get();

Как насчет этого:

var person = Get();

Или вот этот:

var t = GetPerson();

Или вот этот:

var u = Person.Get();

Работает ли ключевое слово var в данном сценарии, во многом зависит от контекста кода, например, от имен переменных, классов и методов, а также от сложности кода.

Лично мне нравится использовать ключевое слово var, оно более полное: me . Но я также склоняюсь называть свои переменные после типа, поэтому я не теряю никакой информации.

Тем не менее, иногда я делаю исключения, такова природа чего-то сложного, а программное обеспечение - ничто, если не сложное.

0 голосов
/ 02 августа 2012

Вот результаты теста, который я провел на эффективность var по сравнению с явной типизацией:

  private void btnVar_Click(object sender, EventArgs e)
    {
        Stopwatch obj = new Stopwatch();
        obj.Start();
        var test = "Test";
        test.GetType();
        obj.Stop();
        lblResults.Text = obj.Elapsed.ToString();
    }

    private void btnString_Click(object sender, EventArgs e)
    {
        Stopwatch obj = new Stopwatch();
        obj.Start();
        string test = "Test";
        obj.Stop();
        lblResults.Text = obj.Elapsed.ToString();

    }

Результат первой метки: 00:00:00 000034

Результат второй метки: 00:00:00 00008

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