ReSharper和var

Ref*_*din 51 .net resharper implicit

可能重复:
为什么ReSharper想要使用'var'作为一切?

我有ReSharper 4.5并且到目前为止发现它非常宝贵,但我有一个顾虑;
它似乎想要隐含每个变量声明(var).
作为一个相对较新的开发人员,在这方面我应该相信ReSharper多少钱?

从Paints Tab Headers的方法中获取以下代码片段.

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
};
Run Code Online (Sandbox Code Playgroud)

Resharper希望我将所有5个改为var.我已经阅读了以下类似帖子,在C#中使用var关键字,但我想从ReSharper的角度来看.

Joe*_*orn 44

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

就个人而言,我经常倾向于单独留下前两行,因为我喜欢看到变量的类型名称明确列在声明变量的行的某处.如果有的话,我可能会寻找一个可以使用的接口,这样我也可以获得与var关键字相同的"泛型",而不会丢失任何重要的可读类型信息.不过,我肯定会用varfillBrush,textBrushsf.

  • 这就是我使用var的方式.对于使用新语句初始化的变量,我将var用于其他类型不明确的变量我使用实际类型. (3认同)

egl*_*ius 18

您不需要在行中使用类型以使其更具可读性,这取决于个人偏好.我喜欢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
   };
Run Code Online (Sandbox Code Playgroud)

更新:我将在其中添加一个有争议的观点.除非我正在阅读一本书中的代码,否则我通常不关心理解我正在阅读的一些代码行的具体类型.考虑.GetTableRectangle(e.Index),您没有显示对其进行操作的代码:

var itemRect = tabCaseNotes.GetTableRectangle(e.Index);
//do some operations on itemRect
Run Code Online (Sandbox Code Playgroud)

在阅读特定代码时,我将从itemRect上的操作中获取更多信息,而不是从类型中理解它.它可以是IRectangle,Rectangle,CustomRectangle,但仍然不会说明代码在做什么.相反,我更关心itemRect.Height,itemRect.Width或itemRect.GetArea()以及所涉及的逻辑.

更新2:正如其他人指出你可以关闭它.确保团队采用相同的做法,或者每次不同的人触摸代码时,您可能会以某种方式进行更改.请参阅:http://www.jetbrains.com/resharper/features/codeTemplate.html


Ste*_*eve 15

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

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

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

  • 我经常使用这个对我有利.也就是说,如果我不是100%确定aa方法返回的是什么,我使用`var`然后使用键盘快捷键使ReSharper将`var`转换为显式类型. (4认同)

Mar*_*tta 7

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


jed*_*mao 7

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

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

最后,虽然我很欣赏,其他人已经指出的(即使用折中varnew语句)和论证是有效的强,我倾向于引导从远的一致性和短手可读性的唯一基础.我的一致性论点是,如果可读性对您来说如此重要,那么为什么不使用它,intAmount以便稍后可以在代码中告诉数据类型?

  • 更糟糕的是,如果有人重构代码.在你的评论中,`weight`和`volume`是流量.有人重构重量/体积以减少值,例如int.猜猜是什么:并不总是知道方法的所有用户.因此,如果使用var,它不会破坏某些东西.有些人觉得很酷:"重构更容易".其他人会注意到你不需要治疗零密度的肿瘤,这可能与pos值有关,例如体重为1,体积为2.没有编译器警告,没有影响?在这种情况下使用`var`真的很危险.很长一段时间没有人会注意到这种变化.这只是一个简短的例子 (7认同)
  • 看一下帖子很明显为什么你的代码永远不会成为一本书.一个方法不应该太久以至于需要intAmount(编码实践),但是如果你使用`var xyz = Silo.GetWeight()`你将永远不知道权重是double,int,float还是更模糊的东西,也许是一个结构有重量和单位?然后,您尝试进行代码审查,并注意到舍入可能很重要. (6认同)
  • 徘徊成本时间.大型公司的代码审查大部分都没有在visual studio中完成(例如:我知道许多医疗解决方案,其中完整的VS部分未用于评论.有时使用投影仪,主要是自己的程序(也是完整的构建)独立于VS,因为你可以使用不同的设置,每个程序员,构建系统使用自己的make与固定参数 - VS只用作编辑器)直接读取10行coede更快然后读取,悬停,焦点和尝试在遗留系统上进行服务.更具可读性=按时受益 (5认同)
  • 让我们举个例子。`var weight = Tumor.GetWeight(); var volume = Tumor.GetActualVolume(); if(体积!= 0)var密度=重量/体积; //做一些长期运行的东西时会产生密度吗?您会很快注意到会产生什么问题吗?在代码审查中,您只能看到代码?如果在大多数情况下,音量是双精度值,则很可能会舍入并与int或0.0 / 0d比较是没有意义的。该信息丢失,您是新来的。想想:“肿瘤类” {...公开双?GetDensity(){...}}`如果将var放入数据库该怎么办(甚至试图修复数据库中的NaN?} (2认同)
  • @Offler如果您担心这样的代码,请编写设计更好的代码。您的代码似乎实际上要询问的是_如果肿瘤有体积,计算密度,或者实际上_如果肿瘤具有密度,则应执行某些操作-因此,编写该代码,而不要重载含义。`if(Tumor.HasDensity){var density = Tumor.GetDensity()//做长时间的工作}现在,您已经将那些讨厌的数字类型特定的计算推到了类中,可以更容易地控制它们的正确性。通常,可以通过更好的设计来避免此类问题。 (2认同)