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


当前回答

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

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

其他回答

没有技术上的区别,如果你使用var,类型是由编译器暗示的。如果你的代码是这样的:

var x = 1;

X被暗示为int型,不能给它赋其他值。

如果你改变变量的类型,var关键字是有用的;你只需要做一个改变,而不是两个:

var x = 1; --> var x = "hello";
int x = 1; --> string x = "hello";

在我看来,只有在定义变量值时立即清楚该变量的类型时才应该使用var。

例子:

var s = "string value";

很明显,s是一个字符串。

我相信当变量类型名称非常复杂时,这也是合适的。

例子:

Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

// This is a little easier to read than the above statement
var dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

除了这些情况,我不认为使用var有任何好处,但我可以想到一些情况下它可能是有害的:

例如,一个一次性类型的右侧变量值没有清楚地显示该类型。一次性用品的处理很容易被遗忘

例子:

// returns some file writer
var wr = GetWriter();

wr.add("stuff");
wr.add("more stuff");

//...
//...

// Now `wr` needs to be disposed, 
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.

根据JetBrains (ReSharper的作者)的说法,他们鼓励在默认情况下使用var。

来自他们的网站:

使用c# 3.0引入的隐式类型局部变量(也称为var关键字)已经变得非常流行,因为它在许多场景中提高了可读性。默认情况下,ReSharper也鼓励使用var关键字,但它的使用首选项是灵活配置的-例如,你可以选择在特定情况下或任何地方使用显式类型,ReSharper将帮助你强制你的首选项。

'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();

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

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

or

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