Почему бы не использовать var везде? - PullRequest
7 голосов
/ 10 мая 2011

За исключением нечитаемого человеком кода, есть ли другая причина не использовать var для каждой переменной в функциях?Я имею в виду, что производительность не влияет на использование int, SqlCommand, string, но вместо этого на использование var?

Ответы [ 5 ]

16 голосов
/ 10 мая 2011

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

Вопрос о использовать или нет петли "var" на его влияние на читателей-людей и сопровождающие кода, а не на его влияние на скомпилированный артефакт.

Посмотрите на эту прекрасную статью: http://blogs.msdn.com/b/ericlippert/archive/2011/04/20/uses-and-misuses-of-implicit-typing.aspx

7 голосов
/ 10 мая 2011

Это точно не удар по производительности.На самом деле var - это не тип, а заполнитель в вашем коде, что означает: «Я не хочу записывать тип этой переменной».На самом деле, если вы наведете курсор на текст в Visual Studio, появится всплывающая подсказка, указывающая тип, который вы сочли слишком длинным для написания!

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

6 голосов
/ 17 апреля 2016

Да, используйте var везде.

Я люблю вар. Это спасло меня от множества нажатий клавиш. Это помогает мне кодировать «первым делом» и делает рефакторинг более мощным.

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

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

Некоторые особенности, где var делает вещи лучше:

  • Вызов метода (не зная, что он возвращает - особенно если это универсальный тип)

Этот большой. Я часто не помню, что возвращает метод, но я знаю имя этого метода. Вытягивание возвращаемого типа из моей головы замедляет меня. Я просто пишу var, вызываю метод со своими входными данными, и вуаля intellisense сообщает мне, что это за тип возвращаемого значения и что я могу с ним сделать.

// Imagine a method that creates a return type that gets some generic type from the call arguments
Tuple<TA,TB,TC,TD,TE> Combine<TA,TB,TC,TD,TE>(TA a, TB b, TC c, TD d, TE e);

// GOOD: Call this with var
var combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");

// BAD: Without var
Tuple<string, int, bool, Dictionary<int, List<string>>, string> combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");
  • Рефакторинг типа возврата

Если я использую var, компилятор немедленно сообщает мне, где этот тип используется неправильно (возможно, у нового возвращаемого типа нет тех же имен свойств).

Если бы я не использовал var, я бы просто получил сообщение об ошибке при назначении типа. Затем я должен был бы изменить этот тип на новый тип (в каждом отдельном месте, где он был вызван), а затем я наконец получил предупреждение о том, что этот тип используется неправильно.

  • Сосредоточьтесь на именовании переменных, а не на перепечатывании имен типов.

var - одна из лучших вещей, которые когда-либо случались с C #.

// BAD: No var
Dictionary<int,List<Tuple<int,bool,string>>> ahhhhThatWasDifficult = new Dictionary<int,List<Tuple<int,bool,string>>>();

// GOOD: With var
// I can think of a good name before writing this complex type
var validNameCountDictionary = new Dictionary<int,List<Tuple<int,bool,string>>>();

Если я все еще не убедил вас, у вас все равно нет выбора, если вы хотите использовать:

  • Анонимные типы
  • Linq

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

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

var number = (int?) null;

Потому что я люблю вар.

P.S. Мне немного грустно, что let заменяет var в Typescript / ES6, но Javasctipt var! == C # var

0 голосов
/ 27 сентября 2018

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

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

var d = default(Derived);

или

var d = (Derived)null;

, но ни один из них не является более читаемым IMO.Я бы не стал делать это только ради использования var.

0 голосов
/ 10 мая 2011

Это примерно implicit and explicit typing. C # .NET - это типизированный язык, означающий, что вы определяете, какой тип данных хранится в памяти. Если вы не определили это, вы сделаете некоторые операции менее безопасными, поэтому вы захотите печатать как можно больше явно. Однако в некоторых случаях тип действительно очевиден из вашего кода, так что вы можете просто оставить его на усмотрение компилятора, чтобы выяснить, каким типом должна быть переменная, а именно implicit typing.

Проблема с отсутствием типов заключается в том, что в памяти, которая, по сути, представляет собой набор из 1 и 0, эти данные могут означать что угодно, поэтому, если вы изначально введете целое число в местоположении 000001, а затем попытаетесь прочитать его как Cat ( просто представьте, что это какой-то тип), тогда ничего из того, что вы только что прочитали из памяти, не будет иметь большого смысла. Вот почему была изобретена система типов, чтобы сказать вам, где какие данные вы храните, и убедиться, что вы читаете данные таким образом, чтобы люди снова могли их понять, а для машины это не совсем так. в конце дня, что это за данные.

...