我刚刚开始在Visual Studio中使用ReSharper(在SO上的许多建议之后)。为了尝试一下,我打开了一个最近的ASP。NET MVC项目。我注意到它建议的第一件也是最频繁的事情之一是将我的大部分/所有显式声明改为var。例如:

//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

等等,即使是简单的类型,如int, bool等。

为什么推荐这个?我没有计算机科学或。net背景,最近“陷入”了。net开发,所以我真的很想了解正在发生什么,以及它是否有益。


当前回答

我很惊讶,没有人提到改变实例化对象的类型也更容易,因为

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

是一种重复的形式。如果我想将AVeryLongTypeName更改为它的派生类之一,我只需要在使用var时更改一次,并且仍然可以访问子类的方法。

除此之外,提高可读性是一个重要的点,但正如其他人所说,var不应该被过度使用,所以我认为关闭Resharper的提示是绝对可以的。

其他回答

顺便说一句,ReSharper在“你可能想把这个建议应用到你的代码中”和“你的代码坏了,想让我修复它吗?”之间做了区分。var关键字在建议类别中,与“反转if以减少嵌套”一样;你不必遵循它。

你可以通过“选项”对话框,或者直接通过弹出菜单来设置每个警报的恼人程度。你可以降级像var建议这样的东西,让它们不那么突出,或者你可以升级像“使用扩展方法”警告这样的东西,让它显示为一个实际的错误。

没有技术上的区别(正如eWolf所指出的)。你可以使用其中一种,生成的CLR代码看起来是一样的。

在我看来,主要的好处是,这往往迫使您使用更好的变量命名。在你的例子中,'foo'是一个非常糟糕的变量名。

我很惊讶,没有人提到改变实例化对象的类型也更容易,因为

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

是一种重复的形式。如果我想将AVeryLongTypeName更改为它的派生类之一,我只需要在使用var时更改一次,并且仍然可以访问子类的方法。

除此之外,提高可读性是一个重要的点,但正如其他人所说,var不应该被过度使用,所以我认为关闭Resharper的提示是绝对可以的。

. net 3.0的var特性仅仅是类型推断,它是类型安全的,并且通常使您的代码更容易阅读。但你不必这么做,如果你愿意,可以在ReSharper中关闭这个建议。

其中一个原因是可读性的提高。哪个更好?

Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();

or

var dictionary = new Dictionary<int, MyLongNamedObject>();