C#和#x27;var';关键字与显式定义的变量

C#和#x27;var';关键字与显式定义的变量,c#,performance,resharper,C#,Performance,Resharper,我目前正在使用ReSharper的30天试用版,到目前为止,它的建议给我留下了深刻的印象。然而,有一个建议令我困惑 当我显式定义变量时,例如: List<String> lstString = new List<String>(); List lstString=new List(); “重新竖琴”添加了一条弯曲的绿线,并告诉我: 使用隐式类型局部变量声明 如果我遵循它的建议,ReSharper会将代码行更改为: var lstString = new List<

我目前正在使用ReSharper的30天试用版,到目前为止,它的建议给我留下了深刻的印象。然而,有一个建议令我困惑

当我显式定义变量时,例如:

List<String> lstString = new List<String>();
List lstString=new List();
“重新竖琴”添加了一条弯曲的绿线,并告诉我:

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

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

var lstString = new List<String>();
var lstString=new List();
那么,将
列表
更改为
变量
,是否有某种性能提升,或者这仅仅是ReSharper的一个特性?我一直被教导,明确定义一个变量,而不是使用动态变量,更为理想。

不。它们发出完全相同的白细胞介素

这只是风格的问题


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

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

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

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

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

我一直被教导,显式定义变量,而不是使用动态变量,更为理想

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

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

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

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

减少键入=提高生产率:)

主要的是,不能像对待真正的动态类型那样,一刻将int分配给var,一刻将字符串分配给var。一旦类型设置好,它就会被卡住。您仍然可以获得intellisense的全面支持和一切。感谢您澄清“var”与dynamic不同,我没有意识到这一点。实际上:可读性越低=生产力越低越好,那么var就越好。var的可读性通常更高,原因很简单,因为要做的读取工作要少得多。var可读性更高的唯一情况是,按照Konrad的建议,创建具有非常长(通常是泛型)类型名称的对象。在那里,变量几乎可以立即与类型匹配,删除大量额外字符可以提高理解能力。在大多数其他情况下,尤其是在使用变量声明由返回值初始化的变量的情况下,由于引入模棱两可的符号而失去了可理解性,这大大降低了可读性。实际上,这是var的一个糟糕用法。只有当类型从上下文中是不言而喻的时,才应该使用它。如果可以在不更改方法名称的情况下更改方法的返回类型,则不应使用var,因为所涉及的类型不明显。@斯蒂芬:为什么表达式的类型不明显会很糟糕?将var用作不明确的符号会严重降低可读性和可理解性。阅读代码时快速掌握对象的类型会导致更快更高的理解力。我同意斯蒂芬的观点。我不喜欢不必要的变量,当你可以写double,int,float,string,Page时。我只在很长的类型名和匿名类型上使用var。var通常会降低readability@Stephen&Mehrad:那是主观的。var通常不会降低我的可读性和可理解性。我发现变量的名称比类型重要得多。如果有一个好名字,当您可以编写var时,编写类型几乎总是违反了DRY规则。var不同于dynamic关键字,而且编译器将把var关键字转换为实际的类型句柄