我刚刚开始在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,什么时候不用。但这只是我的看法。

其他回答

Var可以增加代码的可读性,同时减少对代码的即时理解。同样,它也会降低代码在其他情况下的可读性。有时它的使用是中性的。可读性对理解的衡量不是成比例的,而是取决于具体情况。有时两者同时增加或减少。

这个因素是var应用于什么,以及目标对读者立即混淆其数据类型的支持程度如何,或者是否需要它的类型信息来理解手边的程序部分。

例如,不好的命名会导致var导致代码理解能力下降。这不是var的错:

var value1 = GetNotObviousValue(); //What's the data type? 
//vs. 
var value2 = Math.Abs(-3); // Obviously a numeric data type. 

有时,对于简单的数据类型使用var是没有意义的,因为在没有var的情况下代码更具可读性:

var num = GetNumber(); // But what type of number?
// vs. 
double num = GetNumber(); // I see, it's a double type. 

有时var可以用来隐藏数据类型信息,你不一定想看到它的复杂性:

    IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG! 
    //vs. 
    var q = from t in d where t.Key == null select t;

    // I simply want the first string, so the last version seems fine.  
    q.First().Key; 

当存在匿名类型时,你必须使用var,因为没有类型名可以调用它:

var o = new { Num=3, Name="" };

当你有Visual Studio Intellisense提供类型信息,尽管有var,然后你需要更少地依赖于你的理解,通过严格的代码阅读没有帮助。假设不是每个人都拥有或使用智能感知可能是明智的。

总之,根据上面的例子,我认为全权委托var的应用不是一个好主意,因为大多数事情最好是适度地完成,并基于这里所示的手边的情况。

为什么Resharper默认使用它?为了方便起见,我建议使用它,因为它不能解析情况的细微差别来决定什么时候最好不要使用它。

var关键字是在c# 3.0中引入的——它允许我们忘记显式地指定类型。

你是否使用并没有真正的区别

MyObject foo = DB.MyObjects。SingleOrDefault(w => w. id == 1);

or

var foo = DB.MyObjects。SingleOrDefault(w => w. id == 1);

除了纯粹的可读性和更少的出错机会。

这看起来像是一个clichéd的例子,但下面的内容可能会帮助你理解:

var myInt = 23;

返回int类型,而

var myInt = "23";

返回一个字符串类型。

MSDN参考

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

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

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

var obj = new SomeObject();

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

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

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