Переопределите и неявно типизированные переменные - PullRequest
3 голосов
/ 16 июля 2011

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

IList<T> someVar = new List<T>();

вместо

var someVar = new List<T>();

Зная, что между обоими нет различий в производительностиКстати, я должен игнорировать эти подсказки или придерживаться ключевого слова var?

Это дело вкуса или неявно вводить переменные?

Ответы [ 6 ]

5 голосов
/ 16 июля 2011

Я вижу по крайней мере две причины.

Во-первых, дело СУХОГО принципа : не повторяйте себя.Если в будущем вы решите изменить тип переменной с List<> на Stack<> или LinkedList<>, то с var вам придется изменить в одном месте, в противном случае вам придется изменить в двух местах.1009 *

Два объявления обобщенных типов могут быть довольно длинными.Dictionary<string, Dictionary<int, List<MyObject>>> кто-нибудь?Это не относится к простым List<T>, но у вас не должно быть двух стилей кода для разных типов объектов.

3 голосов
/ 16 июля 2011

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

Ознакомьтесь с статьей Эрика Липперта в блоге Использование и неправильное использование неявной типизации для подробного обсуждения того, когда var подходит.

2 голосов
/ 18 июля 2014

Я использую var только когда объявление типа слишком длинное (15+ символов). В противном случае явное объявление более читабельно.

Чтобы отключить его в Resharper 8.2, выберите Resharper> Параметры> Проверка кода> Уровень проверки> Возможности использования языка. Ввод слова «Использовать» в поле поиска полезен для фильтрации списка.

Reshaper screenshot

2 голосов
/ 16 июля 2011

В основном это проблема стиля кодирования (за исключением анонимных типов).Лично я часто использую var при написании кода, но использую очистку кода ReSharper, чтобы преобразовать их обратно в явную типизацию, когда я закончу.Это позволяет мне писать код быстрее, но затем преобразовать код в то, что, по моему мнению, более читабельно для меня и других (после того, как весь код написан один раз, но читается много раз).

Я отключаю подсказки ReSharper дляиспользуя 'var', отключив следующие «Настройки языковых возможностей» (можно найти в разделе «Параметры», «Проверка кода», «Серьезность проверки»):

Использовать ключевое слово «var», когда инициализатор явно объявляет тип.Ключевое слово 'var', когда это возможно.

Вы можете настроить ReSharper для преобразования 'var' в явный тип в настройках очистки кода в:

Использовать 'var' в объявлении

1 голос
/ 12 ноября 2014

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

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

Тем не менее, один отдельный микро-аспект читабельности заключается в том, следует ли использовать неявную типизацию через ключевое слово var. Краткий ответ: Может быть . Образованный ответ с примерами может сузить Возможно до Редко .

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

(Перспектива языка) Первая причина не использовать неявную типизацию заключается в том, что основной сильной стороной C # является то, что это язык со строгой типизацией. Есть много замечательных языков, сильные стороны которых не включают в себя строгую типизацию, например, Javascript. Каждый язык отличается и имеет свои сильные и слабые стороны. Для C # сильная типизация является одной из его самых сильных сторон.


В этом ответе предполагается, что ваш код является ТВЕРДЫМ. Если вы работаете в унаследованной кодовой базе или являетесь младшим разработчиком, который еще не полностью сфокусировался на внедрении зависимостей или замене Liskov, то микро-настройка вашего использования var находится не там, где вы должны сосредоточиться прямо сейчас .

Существует только несколько способов присвоения переменной. Вот те, о которых я думаю сейчас:

ISomething someVar = new Concrete(); // <1. Can't use var to create Interfaces.

var someVar = GetFromMethod();   // <-- 2. Taken from return type

var someVar = new MyPerson();    // <-- 3. Custom complex reference type

var someVar = new DateTime();    // <-- 4. Built-in simple Reference Type
var someVar = string.Empty;      // <--      <<

var someVar = new List<T>();     // <-- 5. Built-in complex Reference Type
var someVar = new Dictionary<string, Dictionary<int, List<MyObject>>>();

var someVar = true;              // <-- 6. simple Value type assignment

var someVar = 1;                 // <-- 7. complex Value type assignment(s)
var someVar = 1.0;               // <--      <<
var someVar = 1.0d;              // <--      <<

foreach (var i = 0; i <= . . .)  // <-- 8. Same as 7 above, but different context.

var someVar = new {Name = "yo"}; // <-- 9. Instantiate Anonymous Type

(Breakdown)

1. В примере 1 из приведенных выше примеров я иллюстрирую единственный случай, когда вы просто не можете использовать ключевое слово var. Вы, очевидно, не можете создать конкретную реализацию в интерфейсе. Я подробнее расскажу об использовании интерфейсов в # 5. Не Здесь нельзя использовать var

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

3. Почему вы создаете новую версию in-line? Как я уже говорил ранее, эти примеры предполагают, что вы практикуете принципы SOLID. Этот способ объявления переменной создает запах кода. Если вы выполняете поиск по своей базе кода по ключевому слову new, единственными результатами должны быть автоматически сгенерированный код, корень композиции или номер 4 ниже. Не используйте var здесь никогда не делайте этого

4. new DateTime(); и пара других редких встроенных простых типов - это те редкие случаи, когда вы должны видеть ключевое слово new в своей кодовой базе. Использование ключевого слова var в примере 4 не так уж сложно. Но, честно говоря, что вы покупаете, сражаясь, чтобы быть скрытым в этой ситуации? Тот же вопрос для строки. Здесь можно использовать var ... но почему?

5. Вы всегда должны стараться использовать наименее конкретный возможный тип. Короче говоря, это означает использование небольших интерфейсов. Это правило в основном применяется к внешним API-интерфейсам, потому что вы хотите, чтобы изменения были максимально гибкими, не нарушая потребителя. Единственная причина, по которой это правило НЕ строго применяется к внутреннему коду, потому что, если разработчик хочет внести критическое изменение, он может потратить дополнительное время и выполнить дополнительную работу для каскадного исправления ошибок. Это не очень хорошее оправдание.

..... 5.1 Итак, для первой части обратите внимание, что someVar становится типом Generic.List<T>. Если вы хотите создать переменную типа IList, как вы можете видеть, тогда использование ключевого слова var не то, что вам нужно. Как правило, это правило для объявления переменных с наименьшим возможным типом. Посмотрите на: IList против Список . Что если вы намеренно не хотите, чтобы использование вашей переменной включало весь этот дополнительный мусор в List<T>? Есть причина для этих правил. Старайтесь не использовать ключевое слово var, если вы можете следовать этому правилу.

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

6. Это похоже на пример # 7, но применяется к нечисловым типам значений. Простой вопрос: «Почему?» Как я уже сказал в # 4, что вы покупаете? Предполагая, что вы используете значение по умолчанию, вам все равно придется указать тип. Зачем смешивать правила, и что он покупает? Конечно, но почему?

Э.Г .: Вы все равно должны быть иногда явными, зачем смешивать правила?:

bool isVarOkay, canUseVar;
char a, b, c, d, e, f;
bool isSample = true;
byte etc;
var isOtherSample = true; //<-- why?

7. Существует множество типов числовых значений. Большинство рассуждений об этом для точности, а некоторые для семантических целей. В любом случае, почему бы компилятору угадать, что вы хотите, а не явно. Если когда-либо было явное время, типы числовых значений - это время. Что касается обычного int, возможно, есть некоторая возможность использовать var, так как он настолько прямой и очевидный. Но я бы предпочел сохранить это для пункта № 8. Не используйте ключевое слово var

8. Эта структура кода используется во многих местах, так что кажется, что это почти нормально. Но еще раз: почему и что вы экономите? var и int - 3 символа. Конечно, но почему?

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


Заключение

Ключевое слово var неизбежно для анонимных типов. Кроме того, это может быть полезно для универсальных типов с несколькими уровнями универсальных шаблонов, которые делают длинное объявление, как пример Дмитрия Dictionary<string, Dictionary<int, List<MyObject>>>. Наконец, никому не повредит чувства, если вы используете ключевое слово var в примерах, показанных в числах 4, 5, 6 и 8. Но вы ничего не покупаете.

Идея о том, что использование ключевого слова var позволяет изменить тип или придерживаться принципа СУХОЙ, является не чем иным, как ложным оправданием. Только в редких случаях Сторона назначения объявления правильно представляет собой то, чем должен быть Тип.

1 голос
/ 16 июля 2011

Это просто вопрос краткости, как и авто-свойства.Придерживайтесь того, что вам наиболее удобно.

...