Должен ли я * всегда * отдавать предпочтение неявно типизированным локальным переменным в C # 3.0?

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

Dooberry dooberry = new Dooberry();

to

var dooberry = new Dooberry();

Это действительно лучший стиль?


person serg10    schedule 19.08.2008    source источник
comment
ммммм ... dooberries .. вкусно!   -  person Jeff Atwood    schedule 20.09.2008


Ответы (13)


Конечно, это вопрос стиля, но я согласен с Dare: C # 3.0 Implicit Объявления типов: в var или не в var?. Я думаю, что использование var вместо явного типа делает ваш код менее читабельным. В следующем коде:

var result = GetUserID();

Какой результат? Целое число, строка, GUID? Да, это имеет значение, и нет, мне не нужно копаться в коде, чтобы узнать это. Особенно раздражает в примерах кода.

Джефф написал по этому поводу сообщение, в котором он предпочитает var. Но этот парень сумасшедший!

Я вижу образец успеха stackoverflow: раскопайте старые сообщения CodingHorror и (в стиле Jeopardy) сформулируйте их в терминах вопроса.

person Jon Galloway    schedule 19.08.2008
comment
Почему бы не исправить имя переменной вместо того, чтобы жаловаться на var? var userID = GetUserID (); На самом деле не очень важно, является ли идентификатор пользователя строкой или целым числом, это то, что идентифицирует пользователя и должно приниматься соответствующими функциями. - person Ilya Ryzhenkov; 22.09.2008

Я использую его только тогда, когда ясно, что такое var.

мне ясно:

XmlNodeList itemList = rssNode.SelectNodes("item");
var rssItems = new RssItem[itemList.Count];

мне непонятно:

var itemList = rssNode.SelectNodes("item");
var rssItems = new RssItem[itemList.Count];
person sieben    schedule 20.08.2008

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

Стандарт в моей компании - везде использовать var, к которому мы пришли после читая различные рекомендации, а затем потратив некоторое время на то, чтобы проверить, было ли отсутствие аннотированной информации о типе помощью или помехой . Мы чувствовали, что это помощь.

Большинство рекомендаций, на которые ссылаются люди (например, Dare), - это рекомендации, сделанные людьми, которые никогда не пробовали кодировать с использованием var вместо конкретного типа. Это делает рекомендации бесполезными, потому что они не основаны на опыте, а просто экстраполируют.

Лучший совет, который я могу вам дать, - попробовать это на себе и посмотреть, что работает для вас и вашей команды.

person Greg Beech    schedule 21.09.2008

@jongalloway - var не обязательно делает ваш код более нечитаемым.

var myvariable = DateTime.Now
DateTime myvariable = DateTime.Now;

Первый так же читабелен, как и второй, и требует меньше усилий.

var myvariable = ResultFromMethod();

Здесь вы понимаете, что var может сделать код менее читабельным. Мне нравится var, потому что, если я заменяю десятичное число на double, мне не нужно менять его в нескольких местах (и не говорите рефакторинг, иногда я забываю, просто позвольте мне var!)

РЕДАКТИРОВАТЬ: просто прочтите статью, я согласен. ржу не могу.

person Darren Kopp    schedule 19.08.2008

Этот @ Coding Horror прошел хорошее обсуждение.

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

person Ryan Sampson    schedule 19.08.2008

Я чувствую, что это будет один из самых популярных вопросов, которые со временем задают на Stack Overflow. Все сводится к предпочтениям. Все, что вы думаете, более читабельно. Я предпочитаю var, когда тип определен справа, потому что он короче. Когда я назначаю переменную из вызова метода, я использую явное объявление типа.

person John Sheehan    schedule 19.08.2008

Это имеет смысл только тогда, когда вы заранее не знаете тип.

person user79829    schedule 19.03.2009

В C# 9.0 есть новый способ инициализации класса с помощью Новые выражения с целевым типом.

Вы можете инициализировать класс следующим образом:

Dooberry dooberry = new();

Лично мне он нравится больше, чем использование var, и для меня он более читабелен.

Что касается вызова метода, я думаю, это зависит от вас. Лично я предпочитаю указывать тип, потому что я думаю, что это более читабельно:

Dooberry dooberry = GetDooberry();

В некоторых случаях очень ясно, что это за тип, в данном случае я использую var:

var now = DateTime.Now;
person Misha Zaslavsky    schedule 22.06.2021

Одним из преимуществ такого инструмента, как ReSharper, является то, что вы можете писать код, как вам нравится, а затем переформатировать его во что-то более удобное для обслуживания. У меня R # настроен на постоянное переформатирование таким образом, чтобы был виден фактический используемый тип, однако при написании кода я почти всегда набираю var.

Хорошие инструменты позволят вам получить лучшее из обоих миров.

Джон.

person John Richardson    schedule 19.08.2008

«Лучший стиль» субъективен и варьируется в зависимости от контекста.

Иногда проще использовать var вместо того, чтобы вводить очень длинное имя класса, или если вы не уверены в типе возвращаемого значения данной функции. Я обнаружил, что использую 'var' чаще при работе с Linq или в объявлениях цикла.

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

Я считаю, что решение должен принимать разработчик. Серебряной пули нет. Нет «единственно верного пути».

Ваше здоровье!

person OJ.    schedule 19.08.2008

Я вижу образец успеха stackoverflow: раскопайте старые сообщения CodingHorror и (в стиле Jeopardy) сформулируйте их в терминах вопроса.

Я не признаю своей невиновности! Но вы правы, этот вопрос казался относительно популярным.

person serg10    schedule 20.08.2008

На эту тему есть действительно хорошая статья в MSDN, в которой описаны некоторые примеры. где нельзя использовать var:

К объявлениям переменных с неявной типизацией применяются следующие ограничения:

  • var может использоваться только тогда, когда локальная переменная объявлена ​​и инициализирована в том же операторе; переменная не может быть инициализирована значением NULL, группой методов или анонимной функцией.
  • var не может использоваться в полях в области класса.
  • Переменные, объявленные с помощью var, не могут использоваться в выражении инициализации. Другими словами, это выражение допустимо: int i = (i = 20); но это выражение вызывает ошибку времени компиляции: var i = (i = 20);
  • Несколько неявно типизированных переменных не могут быть инициализированы в одном операторе.
  • Если тип с именем var находится в области видимости, то ключевое слово var будет преобразовано в это имя типа и не будет рассматриваться как часть объявления неявно типизированной локальной переменной.

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

person lomaxx    schedule 20.08.2008

Нет, не всегда, но я бы сказал, что часто. Объявления типов не намного полезнее, чем когда-либо были венгерские обозначения. У вас по-прежнему есть та же проблема, что типы могут изменяться, и поскольку инструменты рефакторинга полезны, это не идеально по сравнению с отсутствием необходимости изменять там, где указан тип, кроме одного места, что следует за рекомендацией Don't Repeat Yourself принцип.

Любой однострочный оператор, в котором имя типа может быть указано как для переменной, так и для ее значения, обязательно должен использовать var, особенно когда это длинный Generic<OtherGeneric< T,U,V>, Dictionary< X, Y>>>

person Mark Cidade    schedule 19.08.2008