我刚刚开始在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开发,所以我真的很想了解正在发生什么,以及它是否有益。


当前回答

瓦尔太棒了!我遇到过许多开发人员,他们认为var是绑定到动态类型的,但事实并非如此。它仍然是静态类型的,只是由编译器决定。

下面是使用var的一些惊人的优点

Less typing var is shorter and easier to read, for instanceDictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>() Yuk. var postcodes = new Dictionary<int,IList<string>>() \o/\o/ More descriptive variable names - tenuous one but I think its important to let the fluid nature of var shine here. As var is a bit vague, it really does encourage a more desciptive variable name rather than letting the type speak for itself. Less code changes - if the return type of a method call changes. You only have to change the method call, not every place it’s used. Anonymous types - anonymous types are a really powerful concept, especially in areas such as WebApi partial resources. Without var, they cannot be used.

然而,有时显式声明类型是有用的,我发现这在原语或结构中最有用。例如,我个人不觉得这个语法很有用:

for(var i = 0; i < 10; i++) 
{

}

vs

for(int i = 0; i < 10; i++) 
{

}

这完全取决于个人喜好,但使用var真的会加速你的开发,并打开一个匿名类型的美好世界。

其他回答

在ReSharper(8.02,但可能是其他版本)中,“使用隐式类型的局部变量声明”建议的选项可以根据您的偏好进行调整,不管它是什么,首先打开ReSharper的选项菜单:

然后,在“代码检查”下,通过调整所选语言的“检查严重性”,在我的例子中是c#:

正如你所看到的,有选项可以调整ReSharper提出的所有建议。希望这能帮助像我这样已经有“var”使用策略的人,只是想ReSharper尊重它:)

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

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

我也不喜欢这样。

我不希望这变成一场关于var使用的争论,它有它的用途,但不应该到处使用。

要记住的关键是ReSharper被配置为你想要的任何编码标准。

编辑:ReSharper和var

ReSharper的建议显然是过度使用var关键字。你可以在类型很明显的地方使用它:

var obj = new SomeObject();

如果类型不明显,你应该写出来:

SomeObject obj = DB.SomeClass.GetObject(42);

对于那些不喜欢经常使用“var”的人,你也可以在执行“引入变量”时停止ReSharper默认使用var。这让我很长一段时间都很沮丧,它总是默认为var,而我每次都在改变它。

这些设置在代码编辑> c# >代码样式下