Возможный дубликат:
В чем смысл var ключевое слово?
Всем привет,
Я хочу подтвердить, правильно ли я понимаю. Если я не использую LINQ, то единственное преимущество использования var - это сокращение? Это правильное понимание?
Возможный дубликат:
В чем смысл var ключевое слово?
Всем привет,
Я хочу подтвердить, правильно ли я понимаю. Если я не использую LINQ, то единственное преимущество использования var - это сокращение? Это правильное понимание?
Нет, вы можете использовать var
для создания анонимных типов независимо от того, или нет, вы используете LINQ:
var anon = new { Name = "Anonymous", Age = 42 };
С такими типами также легче работать. Когда у вас очень длинные универсальные типы, имя типа может мешать визуальной идентификации имени переменной как части объявления.
Dictionary<string, Dictionary<int, ICollection<object>>>
особенно если вы вернетесь и измените его на
Dictionary<string, IDictionary<int, ICollection<object>>>
using MyType = Dictionary<string, Dictionary<int, ICollection<object>>>;
- person Daniel Earwicker; 18.07.2009
using
во всех файлах, которые его используют.
- person Sam Harwell; 18.07.2009
Из msdn:
Начиная с Visual C # 3.0, переменные, объявленные в области метода, могут иметь неявный тип var. Неявно типизированная локальная переменная строго типизирована, как если бы вы сами объявили тип, но компилятор определяет тип. Следующие два объявления i функционально эквивалентны:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
Если вы не используете LINQ, var позволяет вам объявлять тип переменной только один раз, а не дважды.
Пример
var myObject = new MyObject();
vs
MyObject myObject = new MyObject();
Это можно сделать только локально, а также полезно для объявления анонимных типов.
Пример
var myAnon = new { Name = "Something", Count = 45 };
За исключением запросов LINQ, я был бы очень осторожен при использовании ключевого слова var. Есть конкретный случай, когда вам просто нужен анонимный тип, но я думаю, что это немного и далеко друг от друга. Var может привести к очень запутанному коду, поскольку вы не знаете, с каким типом имеете дело при чтении кода, если не используете костыль intellisense.
Меня все больше и больше беспокоит то, что я вижу так много фрагментов и фрагментов кода, которые делают следующее ... это лениво, а не то, для чего было предназначено ключевое слово var:
// Not too bad but still shouldn't be done because the only gain you have is keystrokes
var Something = new SomeObject();
// Type here is not obvious, are you getting an int, double, custom object back???
var Something = GetLengthOfSpaghettiCode();
Так что используйте его для LINQ ... используйте его для анонимных типов (если вы действительно используете анонимные типы вне LINQ, вам действительно следует тщательно изучить, зачем вам это нужно).
Цитата из MSDN (самая последняя строка статьи) относительно использования var :
Однако использование var может, по крайней мере, сделать ваш код более трудным для понимания другими разработчиками. По этой причине в документации C # обычно используется var только тогда, когда это необходимо.
Не используйте его как ярлык для сокращения нажатий клавиш, следующий пользователь, просмотревший ваш код, оценит это.
В значительной степени да. var
может использоваться везде, где компилятор может вывести тип переменной из любого значения, которое вы ей присваиваете. (Однако правила вывода типов довольно сложны, поэтому вы можете прочитать спецификацию C # для полного понимания.)
Это не совсем правильно, поскольку ключевое слово var
требуется для определения анонимных типов. Например:
var foo = new { abc = 1, def = 2 };
который, конечно, можно использовать как вне запросов LINQ, так и внутри.
Я не думаю, что использование var должно быть проблемой - и я предпочитаю его именно по причинам удобочитаемости кода. Прежде всего, var - это всего лишь синтаксический сахар и просто компилируется в правильный тип при испускании IL. Что касается читабельности кода, имеет смысл сосредоточиться не только на ее типе, но и на цели, для которой используется переменная и как она присваивается. Редактор VS .NET все равно показывает тип в следующей за ним строке - если вы просто наведете на него курсор. Так что это не должно быть проблемой. Что касается отладки - если вы видите окна Autos / Local / Watch - они отображают типы всех участников.
Для меня имеет смысл видеть такой код:
var customers = GetCustomerList();
foreach (var customer in customers)
{
customer.ProcessOrders();
}
в отличие от
List<CustomerObjectDeserializedFromWebService> customers = GetCustomers();
foreach (CustomerObjectDeserializedFromWebService customer in customers)
{
customer.ProcessOrders();
}
По своей справедливости var ограничивается использованием в объявлениях локальных переменных, которые также инициализируются во время объявления. И в этом одном случае, если вы опустите фактический тип, это определенно улучшит читаемость IMO.
РЕДАКТИРОВАТЬ: И было бы несправедливо с моей стороны не предупреждать об использовании, как показано ниже:
var x = 20;
Это не хорошо; когда литерал применим к нескольким типам, вам необходимо знать тип литерала по умолчанию и, следовательно, понимать, что передается для типа x. Да, я бы во что бы то ни стало избегал таких заявлений.
Я считаю, что он также используется в WCF (Windows Communication Foundation) при работе с данными, полученными через веб-службы и т.п.
Я также обнаружил, что использование var также упрощает рефакторинг в слабосвязанных проектах. Это потому, что мы склонны к сильным типам переменных, но обычно следующий код ожидает более слабых типов. Используя var, вы компенсируете изменения типа в компиляторе.