ReSharper и var

Возможный дубликат:
Почему ReSharper хочет использовать "var" для всего?

У меня есть ReSharper 4.5, и я нашел его неоценимым до сих пор, но у меня есть проблема; Кажется, что нужно сделать каждое объявление переменной неявным (var).
Как относительно новый разработчик, насколько я должен доверять ReSharper, когда дело доходит до этого?

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

TabPage currentTab = tabCaseNotes.TabPages[e.Index];
Rectangle itemRect = tabCaseNotes.GetTabRect(e.Index);
SolidBrush fillBrush = new SolidBrush(Color.Linen);
SolidBrush textBrush = new SolidBrush(Color.Black);
StringFormat sf = new StringFormat
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center
};

Resharper хочет, чтобы я изменил все 5 из них в var. Я прочитал следующую аналогичную запись, Использование ключевого слова var в С#, но я хотел бы узнать с точки зрения ReSharper.

Ответ 1

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

var currentTab = tabCaseNotes.TabPages[e.Index];
var itemRect = tabCaseNotes.GetTabRect(e.Index);
var fillBrush = new SolidBrush(Color.Linen);
var textBrush = new SolidBrush(Color.Black);
var sf = new StringFormat
   {
      Alignment = StringAlignment.Center,
      LineAlignment = StringAlignment.Center
   };

Обновление: Я добавлю спорный взгляд на него. Если я не читаю код из книги, мне обычно не нравится какой конкретный тип для понимания некоторых строк кода, который я читаю. Рассмотрим .GetTableRectangle(e.Index), для которого вы не показываете код, который работает на нем:

var itemRect = tabCaseNotes.GetTableRectangle(e.Index);
//do some operations on itemRect

При чтении этого конкретного кода я получу больше, чтобы понять его из операций над itemRect, чем из его типа. Это может быть IRectangle, Rectangle, CustomRectangle и до сих пор не будет много говорить о том, что делает код с ним. Вместо этого я больше забочусь о itemRect.Height, itemRect.Width или itemRect.GetArea() вместе с задействованной логикой.

Обновление 2: Как указывали другие, вы можете отключить его. Удостоверьтесь, что команда придерживается той же практики, или вы, вероятно, в конечном итоге внесете изменения так или иначе каждый раз, когда другой человек коснется кода. См.: http://www.jetbrains.com/resharper/features/codeTemplate.html

Ответ 2

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

Лично я часто склонен оставлять ваши первые две строки в одиночку, потому что мне нравится видеть имя типа для переменной, явно указанной где-то в строке, где объявлена ​​переменная. Во всяком случае, я мог бы искать интерфейс для использования вместо этого, так что я также получаю ту же "родословную", что и с ключевым словом var, не теряя при этом важной информации, доступной для чтения. Однако я бы определенно использовал var для fillBrush, textBrush и sf.

Ответ 3

Resharper не хочет, чтобы вы использовали var, это дает вам возможность. Если вы используете var, он даст вам возможность использовать явный тип, поэтому вы не сможете выиграть:-).

EDIT - интересная ссылка, обсуждающая тему.

Кажется, он может быть отключен, перейдите в Resharper → Options → Code Inspection → Severence Severence и немного прокрутите список, чтобы увидеть параметры, относящиеся к var.

Ответ 4

В С# я предпочитаю использовать var всюду. Зачем? По той же причине, что я использую firstName вместо strFirstName или amount, а не intAmount. Конечно, более верный способ более читабельен на листе бумаги или, как вы указали, - книге, но ни один из моих кодов еще не появился в книге.

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

SuperDisconfibulator sd=new SuperDisconfibulator();

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