我刚刚开始在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使用的争论,它有它的用途,但不应该到处使用。

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

编辑:ReSharper和var

其他回答

在ReSharper(8.02,但可能是其他版本)中,“使用隐式类型的局部变量声明”建议的选项可以根据您的偏好进行调整,不管它是什么,首先打开ReSharper的选项菜单:

然后,在“代码检查”下,通过调整所选语言的“检查严重性”,在我的例子中是c#:

正如你所看到的,有选项可以调整ReSharper提出的所有建议。希望这能帮助像我这样已经有“var”使用策略的人,只是想ReSharper尊重它:)

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

var x = 1;

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

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

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

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

来自他们的网站:

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

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参考