Я только начал использовать ReSharper с Visual Studio (после многих рекомендаций по SO). Чтобы попробовать это, я открыл недавний проект ASP.NET MVC. Одна из первых и наиболее частых вещей, которые я заметил, предлагает изменить var
вместо этого большинство / все мои явные объявления . Например:
//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
и так далее, даже с простыми типами, такими как int
, bool
и т. д.
Почему это рекомендуется? Я не из области компьютерных наук и не имею опыта работы с .NET, потому что недавно «углубился» в разработку .NET, поэтому мне бы очень хотелось понять, что происходит и приносит ли это пользу или нет.
var
, даже когда тип не совсем очевиден! причина в том, что это вынуждает меня выбирать наиболее описательное имя, которое я могу придумать, и в конечном итоге это делает код намного, намного более читабельным. В конечном итоге это также помогает отделить логику от реализации. Конечно, это только мое мнение, я надеюсь, что это кому-нибудь поможет;).Ответы:
Одна из причин - улучшенная читаемость. Что лучше?
или
источник
var
для всего - я делаю много-много обзоров кода с использованием TFS (различий в сети), и это делает мою работу чрезвычайно трудной: то естьvar items = GetSomeItems();
противIDataReader dr = GetSomeItems();
пропущенного использования оператора в обоих случаях, но мне легче поймать при использованииIDataReader
противvar
.ReSharper предлагает явно злоупотреблять ключевым словом var. Вы можете использовать его там, где тип очевиден:
Если тип неочевиден, лучше написать его:
источник
var
зависит от мнения, а не от «чёткой» той или иной вещи. Я предпочитаю не печатать то, что компилятор может понять сам. Мне нравится вывод типа C #, и я часто хотел бы, чтобы это было так же хорошо, как вывод типа F #. Если бы я мог, я бы пропустил явные типы из параметров метода и возвращаемых типов, как это является нормой в F #. Не все согласны, конечно.Stream
объекта, например, называетсяRead
, а неReadAndReturnNumberOfBytesAsInt32
.Я лично предпочитаю отключить это предложение. Использование
var
часто может улучшить читаемость; но, как вы упомянули, он иногда уменьшает его (с помощью простых типов или когда результирующий тип неясен ).Я предпочитаю выбирать, когда я использую,
var
а когда нет. Но опять же, это только я.источник
var
довольно часто тоже.var methodXYResultIntArray
. Это против всех стандартов кодирования и менее лаконично, чемint[] methodXYResult
. Если вы хотите вернутьbyte[]
метод из метода в будущем, все ваши имена переменных будут неправильными. С явными типами вы могли бы очень легко это изменить. Есть причины использоватьvar
, например, сDictionary<string, List<SomeType<int>>>
. Но если полное имя-типа не слишком длинное, и вы не используетеnew
справа (или явное приведение), резарпер не должен предлагать это.var
может улучшить читаемость кода при одновременном снижении непосредственного понимания кода. Точно так же это может снизить читабельность кода для других ситуаций. Иногда его использование нейтрально. Мера читабельности для понимания не пропорциональна, но зависит от ситуации. Иногда оба увеличиваются или уменьшаются вместе.Фактором является то, к чему
var
применяется и насколько хорошо цель поддерживает немедленное запутывание своего типа данных для читателя, или если информация о его типе необходима для понимания части программы под рукой.Например, неправильное именование может привести к
var
снижению понимания кода. Это неvar
вина, хотя:Иногда не имеет смысла использовать
var
простые типы данных, когда код более читабелен при его отсутствии:Иногда
var
может быть полезно скрыть информацию о типе данных, в которой вам необязательно видеть сложности:Вы должны использовать,
var
когда присутствует анонимный тип, потому что нет имени типа, чтобы вызвать его:Если у вас есть Visual Studio Intellisense, предоставляющая информацию о типе, несмотря на это
var
, вам нужно меньше полагаться на свое понимание через строгое чтение кода без посторонней помощи. Вероятно, разумно предположить, что не все могут использовать или использовать Intellisense.В заключение, основываясь на приведенных выше примерах, я бы предположил, что применение карт-бланш
var
не является хорошей идеей, потому что большинство вещей лучше всего делать в меру и в зависимости от обстоятельств, как показано здесь.Почему Resharper использует все это по умолчанию? Я бы предложил для простоты, потому что он не может проанализировать нюансы ситуаций, чтобы решить, когда лучше не использовать его.
источник
var
, это заставит вас писать достойные имена методов.GetNumber() -but what type?
- ну а тебе какое дело? Если это так важно знать, вызовите методGetNumberAsDouble()
, тогда это так же ясно и будет работать, если у вас есть один метод, возвращающийstring
и один возвращающийdouble
.В ReSharper (8.02, но, вероятно, в других версиях) параметр для предложения «Использовать объявление неявно типизированной локальной переменной» может быть скорректирован в соответствии с вашими предпочтениями , каким бы он ни был, сначала открыв меню параметров для ReSharper:
Затем в разделе «Проверка кода» настройте «Уровень проверки» выбранного вами языка, в моем случае c #:
Как вы можете видеть, есть варианты, чтобы настроить все предложения, которые делает ReSharper. Надеюсь, это поможет кому-то вроде меня, у которого уже есть стратегия использования 'var', и он просто хочет, чтобы ReSharper уважал ее :)
источник
Я удивлен, что никто не упомянул, что также легче изменить тип создаваемого объекта, потому что
это форма повторения . Если я хочу перейти
AVeryLongTypeName
в один из его производных классов, мне нужно изменить его только один раз при использовании,var
и я все еще могу получить доступ к методам дочерних классов.Помимо этого, улучшение читабельности является важным моментом, но, как говорили другие, не следует злоупотреблять var, поэтому я думаю, что отключение подсказки в Resharper - это абсолютно нормально.
источник
'var' означает быть ясным
Основная дискуссия о том, следует ли использовать
var
ключевое слово или нет, заключается в том, насколько читабелен код для вас и других разработчиков.Так же, как если бы вы писали историю, нет однозначного правильного ответа. Но давайте посмотрим на некоторые примеры этого на простом английском языке.
Кто пошел другим путем? Джейк или Билл? В этом случае использование имен «Jake» и «Bill» похоже на использование имени типа. И «он», и «он» - это все равно, что использовать
var
ключевое слово. В этом случае это может помочь быть более конкретным. Следующее, например, гораздо понятнее.В этом случае, будучи более конкретным, предложение стало более понятным. Но это не всегда будет так. В некоторых случаях конкретность затрудняет чтение.
В этом случае было бы легче прочитать предложение, если бы мы использовали «он» и в некоторых случаях исключили его имя, что эквивалентно использованию
var
ключевого слова.Эти примеры охватывают суть, но они не рассказывают всю историю. В этих примерах был только один способ обратиться к человеку. Либо используя их имя, либо используя более общий термин, такой как «он» и «он».
В случае кода у нас есть 3 способа, чтобы помочь добавить ясности. Тип, имя переменной и присвоение. Возьмите эту строку кода, например:
Теперь возникает вопрос: достаточно ли в этой строке кода информации, чтобы помочь вам понять, что происходит?
Как насчет следующей строки кода? Вы все еще знаете, что
p
означает в этом случае:Как насчет сейчас:
Или сейчас:
Или этот:
Или это:
var
Работает ли ключевое слово в данном сценарии, во многом зависит от контекста кода, например, как называются переменные, классы и методы. Это также зависит от сложности кода и остальной части кода, его окружающего.Лично мне нравится использовать
var
ключевое слово, оно более полно для меня большую часть времени. Но я также склоняюсь называть свои переменные после типа, поэтому я не теряю никакой информации.Тем не менее, иногда в зависимости от контекста, который я делаю исключения, такова природа чего-либо сложного, а программное обеспечение - ничто, если не сложное.
источник
var
пока я знаю, что это такое, читая эту строку. Если я понятия не имею, что возвращает метод из другого Решения, использующего другую модель предметной области, я, скорее, определил этот тип явно, что значительно облегчает его чтение. +1Мне это тоже не понравилось.
Я не хочу, чтобы это превратилось в дискуссию об использовании
var
, оно имеет свое применение, но не должно использоваться везде.Важно помнить, что ReSharper настроен на любые стандарты кодирования, которые вы хотите.
Изменить: ReSharper и Вар
источник
Я вижу много правильных ответов, но пропускаю полный.
Это правда, что ReSharper перегружен
var
по умолчанию. Я думаю, что большинство людей согласится с этим. Также легче читать, когдаvar
используется, и тип очевиден, например, когда вы используетеnew
оператор. Я видел один пост, в котором показывалось, как обновить строгость проверки, чтобы показать только подсказки для использованияvar
.Сначала я попытался прокомментировать другие посты, чтобы добавить, где их устанавливать, но у меня не было репутации. Судя по всему, у меня также не было репутации, чтобы опубликовать свой скриншот настроек.
Я объясню, как туда добраться.
В Visual Studio> Главное меню> Resharper> Параметры> Редактирование кода> C #> Стиль кода> Использование переменных в объявлениях
Справочная документация ReSharper: Стиль синтаксиса кода: неявная / явная типизация (ключевое слово 'var') - настройка параметров использования ключевого слова 'var'
источник
Мое правило таково:
Вы объявляя примитивный тип (т.е.
byte
,char
,string
,int[]
,double?
,decimal
и т.д.)? -> Используйте тип:Вы объявляя сложный тип (то есть
List<T>
,Dictionary<T, T>
,MyObj
)? -> Использованиеvar
:источник
string myStr = "foo";
очевидно, что это строка. Я бы поместил все ваши примеры в категорию var ... и объявления, возвращаемые методом для использования типа explicity. Но в конце концов, то, что вы и ваша команда чувствуете лучше для конкретного проекта.Я просто хотел бы отметить, что использование "var" рекомендуется в C # Coding Conventions
так что, вероятно, поэтому в ReSharper этот совет включен по умолчанию. Они также предоставляют некоторые случаи, когда это не улучшит читабельность прямо в том же документе.
источник
System.Diagnostics.PerformanceCounter()
- вы можете легко узнать его счетчик производительности из встроенного класса диагностики. Но какой тип возвращается здесь?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)
? Понятия тактики нет, особенно если в вашем решении более 100 проектов.ReSharper рекомендует,
var
потому что это имеет тенденцию снимать помехи с создания объектов.Сравните эти два примера:
Это просто стенография, которая должна быть легче читаемой.
Я думаю, что это нормально, когда вы создаете новые объекты явно с "новым". Однако в вашем примере это может быть неочевидно, если классы не были названы правильно.
источник
Кстати, ReSharper проводит различие между «вы можете применить это предложение к своему коду» и «ваш код не работает, хотите, чтобы я его исправил?».
var
Ключевое слово в предложении категории, наряду с такими вещами , как «инвертировать , если уменьшить вложенности»; Вы не должны следовать этому.Вы можете настроить раздражение каждого из его предупреждений в диалоговом окне «Параметры» или непосредственно во всплывающем меню для этого предупреждения. Вы можете понизить такие вещи, как
var
предложение, чтобы они стали менее заметными, или вы можете обновить такие вещи, как предупреждение «использовать расширение», чтобы оно отображалось как фактическая ошибка.источник
var
Особенность .Net 3.0 только тип логический вывод , который является безопасным и типа часто делает легче читать ваш код. Но вам не нужно, и вы можете отключить эту рекомендацию в Resharper, если хотите.источник
Вар потрясающий! Я сталкивался со многими разработчиками, у которых сложилось впечатление, что они
var
привязаны к динамическому типу, это не так. Это все еще статически типизировано, это только решено компилятором.Вот некоторые удивительные преимущества использования var
Меньше печатания var короче и легче для чтения, например,
Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()
Yuk.var postcodes = new Dictionary<int,IList<string>>()
\ o / \ o /Более описательные имена переменных - ненадежные, но я думаю, что важно позволить плавной природе
var
сиять здесь. Какvar
немного расплывчатым, это действительно поощрять имя более desciptive переменной , а не давая Говори типа для себя.Менее код изменяется - если изменяется тип возврата вызова метода. Вам нужно только изменить вызов метода, а не каждое место, где он используется.
Анонимные типы - анонимные типы - действительно мощная концепция, особенно в таких областях, как частичные ресурсы WebApi . Без var их нельзя использовать.
Однако иногда полезно явно объявить типы, и я считаю это наиболее полезным в примитивах или структурах. Например, лично я не нахожу этот синтаксис очень полезным:
против
Все
var
зависит от личных предпочтений, но использование действительно ускорит ваше развитие и откроет целый мир доброты анонимного типа.источник
Технических отличий нет, если вы используете var, тип подразумевается компилятором. Если у вас есть такой код:
x подразумевается как int, и никакие другие значения не могут быть ему присвоены.
Ключевое слово var полезно, если вы меняете тип переменной; тогда вам нужно сделать только одно изменение вместо двух:
источник
var
Ключевое слово было введено в C # 3.0 - это позволяет нам забыть об указании нашего типа явно.Нет никакой разницы в том, используете ли вы
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
или
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
кроме чистой читаемости и меньше шансов на ошибку.
Это похоже на клише, но скажите, что следующее может помочь вам понять:
возвращает
int
тип, тогда каквозвращает
string
типСсылка на MSDN
источник
Указание явного типа объекта как-то излишне. Даже переведенный на английский, звучит излишне: «поместите объект типа X в переменную типа X» против «Поместите объект типа X в переменную».
Однако использование 'var' имеет свои ограничения . Это предотвращает использование ниже полиморфизма, который является чистой красотой :
Предположим, собака расширяет животное; Cat расширяет иерархию классов Animal:
Тот же код, с x, объявленным с помощью 'var' , не будет компилироваться .
В любом случае, возвращаясь к первоначальному вопросу, я не использую Resharper, но я предполагаю, что он достаточно умен, чтобы определить, когда не следует использовать 'var'. :-)
источник
as
) чисто ужасно. Вы превращаете ошибки компиляции в ошибки времени выполнения, если у вас есть что-то вродеAnimal x = new Cat(); DoStuffWithDog(x as Dog);
Зачем использовать x? Dog x = new Dog (), Cat y = new Cat (), бум больше не допускает двусмысленности.Animal
в методы, которые принимаютDog
иCat
. Полиморфизм обратный: так что вы можете передавать объекты типаDog
иCat
в методе , который принимаетAnimal
, напримерvoid Walk(Animal a)
:Walk(new Cat())
,Walk(new Dog())
На мой взгляд,
var
следует использовать только тогда, когда сразу понятно, что это за тип при определении значения переменной.Пример:
Очевидно, что
s
этоstring
.Я считаю, что это также уместно, когда имя типа переменной очень сложно.
Пример:
Кроме этих сценариев, я не вижу никакой выгоды, которую можно получить с помощью
var
, но я могу вспомнить некоторые сценарии, в которых это может быть вредно:Например, одноразовый тип, значение переменной в правой части которого не совсем ясно показывает тип. Утилизация IDisposable может быть легко забыта о
Пример:
источник
'var' добавляет своего рода "динамический" элемент в ваш код (хотя, конечно, код остается строго типизированным). Я советую не использовать его в тех случаях, когда тип неясен. Рассмотрим этот пример:
Если возвращаемый тип GetTheObjectFromDatabase () изменится с типа A на B, мы не заметим, так как оба класса реализуют DoSomething (). Код, однако, теперь может фактически сделать что-то совершенно другое.
Это может быть так же тонко, как и запись разных вещей в журнал, так что вы можете не заметить, что слишком поздно.
Следующее использование var всегда должно быть хорошо:
источник
Для тех, кому не нравится постоянное использование «var», вы также можете остановить ReSharper от установки значения по умолчанию для var при выполнении «вводить переменную». Это было чем-то, что меня расстраивало в течение долгого времени, это всегда было по умолчанию, и я менял его каждый раз.
Эти настройки находятся под Редактирование кода> C #> Стиль кода
источник
Технических отличий нет (как указал eWolf). Вы можете использовать один или другой, сгенерированный код CLR будет выглядеть одинаково.
На мой взгляд, главное преимущество заключается в том, что это заставляет вас использовать лучшие имена переменных. В вашем примере 'foo' - довольно плохой выбор для имени переменной.
источник
По словам JetBrains (автора ReSharper), они поощряют использование var по умолчанию.
С их сайта :
источник