Resharper: vars

Почему Resharper хочет, чтобы вы изменили большинство переменных на тип var вместо фактического типа в коде?


person CSharpAtl    schedule 17.11.2008    source источник


Ответы (8)


Это просто вариант. Вы можете отключить его:

ReSharper -> Параметры -> Проверка кода -> Уровень серьезности проверки -> Повторяемость кода -> Используйте ключевое слово 'var', где это возможно: измените его на "Не показывать"

Также есть опция контекста (лампочка), которая проведет вас в каждом направлении - это в ReSharper -> Параметры -> Языки -> C # -> Действия контекста -> «Заменяет явное объявление типа на 'var'»

person Jon Skeet    schedule 17.11.2008
comment
Я полагаю, исходя из ваших знаний о Resharper, вы думаете, что это стоит лицензионной цены? - person CSharpAtl; 17.11.2008
comment
Абсолютно. Я люблю это. Опять же, для меня как для MVP стоимость лицензии была 0 долларов, так что я предвзято;) - person Jon Skeet; 17.11.2008
comment
В ReSharper 6 я нашел это в ReSharper ›Параметры› Проверка кода ›Уровень проверки› Возможности использования языка ›По возможности используйте ключевое слово 'var'. Установите для него значение «Не показывать». - person Sarah Vessels; 22.05.2012
comment
Этот вариант, хотя и полезен для изучения новых языковых функций, может быть плохим для начинающих программистов, которые следуют ему, чтобы записать и сделать все var! Возможно, это должно быть отключено по умолчанию. - person lahsrah; 25.07.2012

Я видел видео от Хади Харири, где он представлял Resharper 6.x. Его аргументация заключалась в том, что если вы заставляете пользователя использовать «var», вы фактически заставляете его называть переменную более осмысленным способом, таким образом, все имена читабельны и имеют больше смысла.

person floatingmarbles    schedule 30.08.2011

По умолчанию это будут объявления этого типа "зеленой волнистой линией":

Person p = new Person();
^^^^^^

Из-за повторения.

Он также предложит (маленькое зеленое подчеркивание) var, когда его можно вывести:

Person p = repository.GetPerson(1);
¯¯¯

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

Как заявил Джон Скит, вы можете отключить эти предложения в параметрах resharper.

person David Thibault    schedule 17.11.2008

Чтобы ответить на ваш вопрос ... потому что кто-то в JetBrains решил, что это «предпочтительный» способ.

Чтобы изменить это, следуйте ответу Джона. Кроме того, вы также можете изменить поведение ReSharper при очистке кода (которую я часто использую) в разделе «Очистка кода» в параметрах ReSharper. Установите "Использовать явный тип".

person Kyle West    schedule 17.11.2008
comment
Это, пожалуй, единственное, что мне не нравится в Resharper из коробки. ИМО, это продвигает плохое программирование ... но var vs! Var - это религиозная война ... так что каждый сам за себя. - person Pure.Krome; 18.11.2008
comment
@ Pure.Krome, я бы согласился, но ответы на плавающие шарики действительно имеют смысл :). Это заставит вас иметь значимое имя ... Если бы я только мог избавиться от своей дурной привычки писать: var v = ... :) - person Noctis; 25.07.2014

Это объяснение этого вики-страницы по проверке кода JetBrains: http://confluence.jetbrains.net/display/ReSharper/Use+%27var%27+keyword+when+initializer+explicitly+declares+type

Если вы видите класс справа, нет необходимости видеть его и слева. Также это экономит место и сокращает объем кода, если имя класса довольно длинное. Лично я не использую var для простых типов, таких как string, int и т. Д., Но использую его для чего-то вроде var dictionary = new Dictionary<string, int>(), чтобы сэкономить место.

person Ilya Chernomordik    schedule 23.11.2012

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

Было бы хорошо использовать переменные, например, для переменных цикла, при итерации коллекции и т. Д., Когда тип для вас «неявный» (он, конечно, всегда неявный для компилятора, когда Resharper предлагает это) и его отсутствие не делает код менее читаемым. Кроме того, мне нравится сокращать некоторые объявления, которые могут стать довольно длинными с обобщениями. Например, IList (IDictionary (SomeType)) myVar = List (IDictionary (SomeType)) () не сильно потеряет, если вы напишете «var» в левой части присваивания.

(Заменить скобки угловыми скобками;)

Конечно, я бы попытался использовать vars осторожно, чтобы улучшить читаемость, а не наоборот.

person Paul Kapustin    schedule 17.11.2008
comment
(вы можете использовать угловые скобки, если они заключены в обратные кавычки) SomeCode<int>. - person mackenir; 17.11.2008
comment
Преобразование в явный тип - это только действие контекста (по крайней мере, в моем R # 5.1.3). Похоже, что JetBrains предпочитает «вары». Но для меня это нормально, потому что я не так много смотрю на предложения. - person thersch; 23.11.2012

Для меня это определенно стоит своей цены ... (даже если мне пришлось бы заплатить самому). Но это может замедлить работу VS. Это может стать очень медленным, если у вас есть файлы вроде 5000 строк кода.

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

person Paul Kapustin    schedule 17.11.2008
comment
Да, я с нетерпением жду следующего релиза, который должен быть ориентирован на производительность. И я тоже :) - person mackenir; 17.11.2008
comment
Файл с 5000 строками кода - ничего себе. Похоже, нужно провести некоторый рефакторинг. Кстати, вы можете разделить файл кода, определив частичные классы. - person Philipp Schmid; 18.11.2008
comment
собственно у меня один с 6000. частичные классы не помогли бы - ДНК :) - person Paul Kapustin; 19.11.2008

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

Как говорит Джон, это всего лишь вариант.

person Jonas Kongslund    schedule 17.11.2008
comment
Не во всех случаях. Рассмотрим пример Status satus = foo.DoSomething(). Запись с помощью var скрывает фактический тип возвращаемого значения и делает его более нечитаемым. status может быть любым, например int. - person Razer; 25.04.2013