我刚刚开始在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关键字的主要争论是关于代码对您和其他开发人员的可读性。

就像你在写一个故事一样,没有明确的正确答案。但是让我们看一些简单英语中的例子。

杰克向比尔问好。他不喜欢他,所以转身朝另一个方向走了。

谁走了另一条路?杰克还是比尔?在本例中,使用名称“Jake”和“Bill”就像使用类型名称一样。"He"和"him"就像使用var关键字。在这种情况下,说得更具体可能会有所帮助。下面的例子就清楚多了。

杰克向比尔问好。杰克不喜欢比尔,所以他转身朝另一个方向去了。

在这种情况下,越具体句子越清晰。但情况并非总是如此。在某些情况下,说得太具体会让人更难理解。

比尔喜欢书,所以比尔去了图书馆,比尔拿出了一本比尔一直喜欢的书。

在这种情况下,如果我们使用“he”,在某些情况下将他的名字一起省略,这相当于使用var关键字,将更容易阅读句子。

比尔喜欢书,所以他去了图书馆,拿出了一本他一直喜欢的书。

这些例子涵盖了要点,但并不能说明全部问题。在这些例子中,只有一种方式来指代这个人。要么使用他们的名字,要么使用更笼统的术语,比如“他”和“他”。

对于代码,我们有三种方法来帮助增加清晰度。类型、变量名和赋值。以这行代码为例:

Person p = GetPerson();

现在的问题是,这行代码中是否有足够的信息来帮助您弄清楚发生了什么?

下面这行代码呢?在这种情况下,你还知道p的意思吗?

var p = GetPerson();

现在怎么样:

var p = Get();

或者现在:

var person = Get();

或者这个:

var t = GetPerson();

或:

var u = Person.Get();

关键字var在给定场景中是否有效在很大程度上取决于代码的上下文,比如变量、类和方法的命名方式。它还取决于代码的复杂性以及围绕它的其余代码。

就我个人而言,我喜欢使用var关键字,它在大多数时候对我来说更全面。但我也倾向于用类型来命名变量这样就不会丢失任何信息。

这就是说,有时我会根据上下文做出例外,这就是任何复杂事物的本质,软件如果不复杂就什么都不是。

其他回答

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

指定显式对象类型在某种程度上是多余的。即使用英语翻译,它听起来也是多余的:“将X类型的对象放入X类型的变量中”vs“将X类型的对象放入变量中”。

然而,使用'var'有其局限性。它防止了以下纯美的多态用法:

假设狗伸展动物;Cat扩展了动物等级:

Animal x = new Dog();
DoStuffWithDog(x as Dog);

x = new Cat();
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

同样的代码,用'var'声明x将无法编译。

var x = new Dog(); // from this point, x is a Dog
DoStuffWithDog(x as Dog);

x = new Cat(); // cannot assign a Cat instance to a Dog
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

无论如何,回到最初的问题,我不使用Resharper,但我假设它足够智能,可以检测到什么时候不使用'var'。: -)

我的原则是:

你是否声明了一个基本类型(即字节,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,什么时候不用。但这只是我的看法。

. net 3.0的var特性仅仅是类型推断,它是类型安全的,并且通常使您的代码更容易阅读。但你不必这么做,如果你愿意,可以在ReSharper中关闭这个建议。