我刚刚开始在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 bar = GetTheObjectFromDatabase();
bar.DoSomething();
ClassA {
void DoSomething() {
//does something
}
}
ClassB {
void DoSomething() {
//does something entirely different
}
}
如果GetTheObjectFromDatabase()的返回类型从Type A更改为B,我们不会注意到,因为这两个类都实现了DoSomething()。然而,现在的代码实际上可能做一些完全不同的事情。
这可能就像在日志中写入不同的内容一样微妙,所以您可能不会注意到,直到为时已晚。
var的以下用法应该总是正确的:
var abc = new Something();
在我看来,只有在定义变量值时立即清楚该变量的类型时才应该使用var。
例子:
var s = "string value";
很明显,s是一个字符串。
我相信当变量类型名称非常复杂时,这也是合适的。
例子:
Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();
// This is a little easier to read than the above statement
var dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();
除了这些情况,我不认为使用var有任何好处,但我可以想到一些情况下它可能是有害的:
例如,一个一次性类型的右侧变量值没有清楚地显示该类型。一次性用品的处理很容易被遗忘
例子:
// returns some file writer
var wr = GetWriter();
wr.add("stuff");
wr.add("more stuff");
//...
//...
// Now `wr` needs to be disposed,
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.
瓦尔太棒了!我遇到过许多开发人员,他们认为var是绑定到动态类型的,但事实并非如此。它仍然是静态类型的,只是由编译器决定。
下面是使用var的一些惊人的优点
Less typing var is shorter and easier to read, for instanceDictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>() Yuk.
var postcodes = new Dictionary<int,IList<string>>() \o/\o/
More descriptive variable names - tenuous one but I think its important to let the fluid nature of var shine here. As var is a bit vague, it really does encourage a more desciptive variable name rather than letting the type speak for itself.
Less code changes - if the return type of a method call changes. You only have to change the method call, not every place it’s used.
Anonymous types - anonymous types are a really powerful concept, especially in areas such as WebApi partial resources. Without var, they cannot be used.
然而,有时显式声明类型是有用的,我发现这在原语或结构中最有用。例如,我个人不觉得这个语法很有用:
for(var i = 0; i < 10; i++)
{
}
vs
for(int i = 0; i < 10; i++)
{
}
这完全取决于个人喜好,但使用var真的会加速你的开发,并打开一个匿名类型的美好世界。
我看到了许多正确答案,但没有完整的答案。
ReSharper确实在默认情况下过度使用var。我想大多数人都会同意这一点。当使用var并且类型很明显时(例如使用new语句时),它也更容易阅读。我看到一篇文章展示了如何更新检查的严重性,只显示使用var的提示。
我曾尝试在其他帖子上评论,添加在哪里设置这些,但没有这样的声誉。显然,我也没有名声发布我的设置截图。
我会解释怎么去那里。
在Visual Studio >主菜单> Resharper > Options > Code Editing > c# > Code Style > Var using In declarations
对于内置类型使用显式类型
对于简单类型,在明显时使用'var'
在其他地方使用'var '
ReSharper帮助文档:代码语法风格:隐式/显式类型('var'关键字)
-配置使用'var'关键字的首选项