Почему бы не использовать ВАР везде?

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

5 ответов


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

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


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

вопрос использовать или не использовать шарниры " var о его влиянии на читателей-людей и хранители кода, не на его влияние на собранный артефакт.

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


Это определенно не хит производительности. var на самом деле не тип, а заполнитель в вашем коде, что означает: "Я не хочу записывать тип этой переменной."Фактически, если вы наведете курсор на текст в Visual Studio, он покажет подсказку, указывающую тип, который вы решили слишком долго писать!

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


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

Я люблю 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;

потому что я люблю var.

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


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

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

Derived d = null;
var someInfo = GetInfo(d);

...

// Base is an ancestor of Derived    
Info GetInfo(Base b)
{
   if (b is Derived) return 1;
   if (b is Derived2) return 2;
   ...
}

может, поочередно вы могли бы сделать:

var d = default(Derived);

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