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


当前回答

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

比较这两个例子:

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

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

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

其他回答

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

我的原则是:

你是否声明了一个基本类型(即字节,char,字符串,int[], double) ?,十进制,等等)?->类型: string myStr = "foo"; int[] myIntArray = [123, 456, 789]; 双吗?myDouble = 123.3; 您是否声明了一个复杂类型(即List<T>, Dictionary<T, T>, MyObj)?->使用var: var myList =列表<字符串>(); var myDictionary = Dictionary<string, string>(); var myObjInstance = new MyObj();

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

var x = 1;

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

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

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

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

var obj = new SomeObject();

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

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

我个人倾向于关闭这个建议。使用var通常可以提高可读性;但正如您所提到的,它有时会减少它(使用简单类型,或当结果类型不明确时)。

我更喜欢选择什么时候用var,什么时候不用。但这只是我的看法。