我刚刚开始在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的提示是绝对可以的。

其他回答

我也不喜欢这样。

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

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

编辑:ReSharper和var

'var'为你的代码添加了一种“动态”元素(尽管代码仍然是严格类型的)。我建议不要在类型不清楚的情况下使用它。想想这个例子:

var bar = GetTheObjectFromDatabase();
bar.DoSomething();

ClassA {
  void DoSomething() {
  //does something
  }
}

ClassB {
  void DoSomething() {
  //does something entirely different
  }
}

如果GetTheObjectFromDatabase()的返回类型从Type A更改为B,我们不会注意到,因为这两个类都实现了DoSomething()。然而,现在的代码实际上可能做一些完全不同的事情。

这可能就像在日志中写入不同的内容一样微妙,所以您可能不会注意到,直到为时已晚。

var的以下用法应该总是正确的:

var abc = new Something();

ReSharper推荐var,因为它倾向于整理对象创建。

比较这两个例子:

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

这只是一种简写,应该更容易阅读。

我认为,当你显式地用“new”创建新对象时,这很好。然而,在您的示例中,如果类没有正确命名,可能就不那么明显了。

我看到了许多正确答案,但没有完整的答案。

ReSharper确实在默认情况下过度使用var。我想大多数人都会同意这一点。当使用var并且类型很明显时(例如使用new语句时),它也更容易阅读。我看到一篇文章展示了如何更新检查的严重性,只显示使用var的提示。

我曾尝试在其他帖子上评论,添加在哪里设置这些,但没有这样的声誉。显然,我也没有名声发布我的设置截图。

我会解释怎么去那里。

在Visual Studio >主菜单> Resharper > Options > Code Editing > c# > Code Style > Var using In declarations

对于内置类型使用显式类型 对于简单类型,在明显时使用'var' 在其他地方使用'var '

ReSharper帮助文档:代码语法风格:隐式/显式类型('var'关键字) -配置使用'var'关键字的首选项

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

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

or

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