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