2009-01-09 36 views
29

我目前正在使用ReSharper的30天试用版,到目前为止,我对它的建议印象深刻。然而,一个建议让我感到困惑。C#'var'关键字与明确定义的变量

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

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

ReSharped增添了些许弯弯曲曲的绿线,并告诉我:

使用隐式类型的本地变量声明。

如果我然后按照其建议,ReSharper的改变的代码行:

var lstString = new List<String>(); 

那么,有没有某种性能增益从改变List<String>var了,或者是这仅仅是ReSharper的一个特点?我总是被教导明确定义一个变量,而不是使用动态变量,这是更优化的。

+0

变种是比动态关键字不同, 也编译器将VAR关键字转换为实际类型手柄 – erdogany 2009-01-09 19:53:08

回答

60

那么,有没有某种形式的性能增益要更改列表到VAR

不,但这不是重构的唯一有效原因。更重要的是,它消除了冗余,并使代码缩短而不会造成任何损失。

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

您误解了var的含义。这是不是以任何方式动态,因为它产生相同的输出。这只是意味着编译器会自行计算变量的类型。它显然有能力这样做,因为这是用于测试类型安全性和正确性的相同机制。

它也消除了完全无用的代码重复。对于简单的类型,这可能不会太多。但考虑:

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

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

12

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

这只是一个风格问题。

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

+6

其实,这是一个贫穷的使用变种。只有在类型从上下文中不言而喻的情况下才能使用它。如果你可以改变方法的返回类型而不改变它的名字,那么你不应该使用var,因为涉及的类型不明显。 – 2009-01-09 20:28:09

+0

@Stephen:当表达式的类型不是很明显时,为什么它很糟糕? – 2009-01-09 21:14:54

+3

将var用作模糊符号会严重降低可读性和可理解性。在阅读代码时快速掌握对象的类型导致了更快,更高的理解。 – 2009-01-09 21:59:00

8

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

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

1

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