English 中文(简体)
ReSharper和var[重复]
原标题:
  • 时间:2009-04-10 14:43:41
  •  标签:
This question already has answers here:
Closed 10 years ago.

Possible Duplicate:
Why does ReSharper want to use var for everything?

I have ReSharper 4.5 and have found it invaluable so far but I have a concern;
It seems to want to make every variable declaration implicit (var).
As a relatively new developer, how much should I trust ReSharper when it comes to this?

从绘制选项卡标题的方法中获取以下代码片段。

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。我读过以下类似的帖子,在C#中使用var关键字,但我想从ReSharper的角度来了解。

最佳回答

您不需要在行中输入类型以使其更具可读性,这是个人偏好的问题。我确实喜欢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

问题回答

Resharper主要关心帮助您重构代码,var关键字通常会使重构变得更容易。例如,如果这些函数中的任何一个的返回值更改为兼容类型,则不必更改任何代码。因此,现在重构<code>tabCaseNotes</code>类型稍微容易一些。

就我个人而言,我经常倾向于不使用前两行,因为我喜欢看到变量的类型名称在声明变量的行上的某个处显式列出。如果有什么不同的话,我可能会寻找一个接口来代替,这样我也可以获得与var关键字相同的“泛型”,而不会丢失任何重要的可读类型信息。然而,对于fillBrushtextBrushsf,我肯定会使用var

Resharper不希望您使用var,它为您提供了选项。如果您确实使用var,那么它将为您提供使用显式类型的选项,因此您无法获胜:-)。

编辑-有趣的链接讨论该主题。

它似乎可以关闭,转到Resharper->;选项->;代码检查->;Inspection Severity(检查严重性)并向下滚动一点以查看与var相关的选项。

Resharper认为这是最好的做法,但正如你在链接帖子中所读到的,有些人不同意。我喜欢使用显式声明来增加可读性,但每个声明都有自己的可读性。如果要使用显式声明,可以在Resharper中禁用该规则。

在C#中,我更喜欢在任何地方使用var。为什么?出于同样的原因,我使用firstName而不是strFirstNameamount,而不是intAmount

不久前,我向我的一位同事询问了这项intAmount业务,他提出了一个非常好的观点。他说,它在直接的文本编辑器中很有用,但当你有Intellisense时,你只需将鼠标悬停在变量上就可以获得相同的信息和更多信息。

最后,尽管我很欣赏其他人所指出的快乐媒介(即在new语句中使用var),而且这个论点是有效和有力的,但我倾向于仅基于一致性和短期可读性来回避它。我的一致性论点是,如果可读性对您来说如此重要,那么为什么不同时使用intAmount,以便稍后在代码中告诉数据类型呢?

这个问题是引发一场激烈战争的好方法。然而,你应该做任何你和与你共事的人认为最可读的事情。关于var的争论双方都有很好的论据。

也就是说,如果您认为显式声明类型更可读,那就是您的业务。你不必按照Resharper告诉的做。如果你想,你甚至可以禁用该规则。

你确实可以关掉它,我也可以。我承认,在某些情况下,类类型名称很长,这很好,比如:

SuperDisconfibulator sd=new SuperDisconfibulator();

将是缩短为var的一个很好的候选者,但就我个人而言,这是我唯一希望它改变的时候。我认为在从方法的返回值分配变量时(如第二行)使用它不是一个好主意,因为它可能不会立即清楚返回的变量类型。





相关问题