ReSharper和var

时间:2009-04-10 14:43:42

标签: .net resharper implicit

  

可能重复:
  Why does ReSharper want to use 'var' for everything?

我有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 。我已阅读以下类似帖子Use of var keyword in C#,但我想从ReSharper的角度来了解。

7 个答案:

答案 0 :(得分:43)

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

就个人而言,我经常倾向于单独留下前两行,因为我希望在声明变量的行上看到明确列出 somewhere 的变量的类型名称。如果有的话,我可能会寻找一个可以使用的接口,这样我也可以获得与var关键字相同的“泛型”,而不会丢失任何重要的可读类型信息。但是,我肯定会将var用于fillBrushtextBrushsf

答案 1 :(得分:16)

您不需要在该行中使用该类型以使其更具可读性,这取决于个人偏好。我喜欢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 :(得分:14)

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

编辑 - 讨论该主题的有趣link

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

答案 3 :(得分:6)

Resharper认为这是最好的做法,但有些人不同意,因为你已经阅读了链接的帖子。我喜欢使用显式声明来提高可读性,但是对于每个人都有自己的可读性。如果要使用显式声明,可以在Resharper中禁用该规则。

答案 4 :(得分:6)

在C#中,我更喜欢在任何地方使用var。为什么?出于同样的原因,我使用firstName代替strFirstNameamount而不是intAmount。当然,更冗长的方式在一张纸上更具可读性,或者 - 正如你所指出的那样 - 一本书,但我的代码中还没有出现在书中。

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

最后,虽然我很欣赏其他人指出的快乐媒介(即使用varnew语句)并且论证是有效且强大的,但我倾向于避开仅基于一致性和短手可读性。我的一致性论点是,如果可读性对您来说非常重要,那么为什么不使用intAmount以便稍后在代码中告诉数据类型呢?

答案 5 :(得分:0)

这个问题是开始火焰战的一个非常好的方法。但是,你应该做任何你做的事情,而你工作的人认为最具可读性。关于var的争论双方都有很好的论据。

也就是说,如果您认为明确声明类型更具可读性,那就是您的业务。你不必做Resharper告诉你的所有事情。如果您愿意,甚至可以禁用该规则。

答案 6 :(得分:0)

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

SuperDisconfibulator sd=new SuperDisconfibulator();

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