我刚刚开始在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关键字。你可以在类型很明显的地方使用它:

var obj = new SomeObject();

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

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

其他回答

我很惊讶,没有人提到改变实例化对象的类型也更容易,因为

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

是一种重复的形式。如果我想将AVeryLongTypeName更改为它的派生类之一,我只需要在使用var时更改一次,并且仍然可以访问子类的方法。

除此之外,提高可读性是一个重要的点,但正如其他人所说,var不应该被过度使用,所以我认为关闭Resharper的提示是绝对可以的。

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

var x = 1;

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

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

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

指定显式对象类型在某种程度上是多余的。即使用英语翻译,它听起来也是多余的:“将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'。: -)

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

来自他们的网站:

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

我看到了许多正确答案,但没有完整的答案。

ReSharper确实在默认情况下过度使用var。我想大多数人都会同意这一点。当使用var并且类型很明显时(例如使用new语句时),它也更容易阅读。我看到一篇文章展示了如何更新检查的严重性,只显示使用var的提示。

我曾尝试在其他帖子上评论,添加在哪里设置这些,但没有这样的声誉。显然,我也没有名声发布我的设置截图。

我会解释怎么去那里。

在Visual Studio >主菜单> Resharper > Options > Code Editing > c# > Code Style > Var using In declarations

对于内置类型使用显式类型 对于简单类型,在明显时使用'var' 在其他地方使用'var '

ReSharper帮助文档:代码语法风格:隐式/显式类型('var'关键字) -配置使用'var'关键字的首选项