33

我目前正在使用 ReSharper 的 30 天试用版,到目前为止,我对它提出的建议印象深刻。然而,一个建议让我感到困惑。

当我明确定义一个变量时,例如:

List<String> lstString = new List<String>();

ReSharped 添加了一条弯曲的绿线并告诉我:

使用隐式类型局部变量声明。

如果我遵循它的建议,ReSharper 会将代码行更改为:

var lstString = new List<String>();

List<String>那么,将 a 更改为 a是否会带来某种性能提升var,或者这仅仅是 ReSharper 的一个特性?我一直被教导明确定义一个变量,而不是使用一个动态,是更优化的。

4

4 回答 4

61

那么,将 List 更改为 var 是否会带来某种性能提升

不,但这不是重构的唯一正当理由。更重要的是,它消除了冗余并使代码更短,而不会损失任何清晰度。

我一直被教导明确定义一个变量,而不是使用一个动态,是更优化的。

你误解了什么var意思。这绝不是动态的,因为它产生相同的输出。这只是意味着编译器自己计算出变量的类型。它显然有能力这样做,因为这是用于测试类型安全性和正确性的相同机制。

它还删除了完全无用的代码重复。对于简单类型,这可能并不多。但请考虑:

SomeNamespace.AndSomeVeryLongTypeName foo = new SomeNamespace.AndSomeVeryLongTypeName();

显然,在这种情况下,将名称加倍不仅没有必要,而且实际上是有害的。

于 2009-01-09T19:54:35.403 回答
12

没有。它们发出完全相同的 IL

这只是风格问题。

var有一个好处是可以让您更轻松地更改函数的返回类型,而无需更改源代码的其他部分。例如,将返回类型从 更改IEnumerable<T>List<T>。但是,它可能更容易引入错误。

于 2009-01-09T19:51:15.520 回答
8

var关键字实际上并未声明具有动态类型的变量。该变量仍然是静态类型的,它只是从上下文中推断出类型。

当你有一个长类型名时,它是一个很好的快捷方式(通用类型名可以很长)

于 2009-01-09T19:54:03.173 回答
1

更少的打字=更高的生产力:)

于 2009-01-09T19:56:58.220 回答