C#'var'关键字与显式定义的变量[重复]

Posted

技术标签:

【中文标题】C#\'var\'关键字与显式定义的变量[重复]【英文标题】:C# 'var' keyword versus explicitly defined variables [duplicate]C#'var'关键字与显式定义的变量[重复] 【发布时间】:2010-09-30 13:49:42 【问题描述】:

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

当我显式定义一个变量时,比如:

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

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

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

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

var lstString = new List<String>();

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

【问题讨论】:

var 与 dynamic 关键字不同,编译器也会将 var 关键字转换为实际的类型句柄 【参考方案1】:

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

【讨论】:

实际上:可读性差 = 效率低 好,那么 var 就更好了。 var 通常更具可读性,仅仅是因为要做的阅读量要少得多。 只有在创建具有极长(通常是通用)类型名称的对象时,var 才更具可读性,正如 Konrad 所建议的那样。在那里,var 几乎可以立即与类型匹配,并且删除大量额外字符提高了可理解性。 在大多数其他情况下,尤其是在使用 var 声明由返回值初始化的变量的情况下,由于引入歧义符号而导致的可理解性损失大大降低了可读性。 【参考方案2】:

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

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

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

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

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

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

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

【讨论】:

感谢您澄清“var”与动态不同,我没有意识到这一点。【参考方案3】:

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

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

【讨论】:

最主要的是你不能像使用真正的动态类型一样,先将 int 分配给 var,然后再分配字符串。一旦设置了类型,它就会被卡住。您仍然可以获得完整的智能感知支持和一切。【参考方案4】:

不。它们发出完全相同的 IL

这只是风格问题。

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

【讨论】:

其实这是一个不好用的var。仅当类型从上下文中不言而喻时才应使用它。如果您可以更改方法的返回类型而不更改其名称,那么您不应该使用 var,因为所涉及的类型并不明显。 @Stephen:当表达式的类型不是很明显时,为什么会很糟糕? 使用 var 作为模棱两可的符号会严重降低可读性和可理解性。阅读代码时快速掌握对象的类型会导致更快和更高的理解。 我同意斯蒂芬的观点。我不喜欢不必要的 var,因为你可以只写 double、int、float、string、Page。我只在很长的类型名称和匿名类型上使用 var。 var 通常会降低可读性 @Stephen & Mehrad:这是主观的。 var 通常不会降低我的可读性和可理解性。我发现变量的名称比类型更重要。给定一个好名字,写出一个可以写 var 的类型几乎总是违反 DRY 规则。

以上是关于C#'var'关键字与显式定义的变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中实现接口与显式实现接口 [重复]

003 值与类型

js中定义变量问题,请问定义变量时有var关键字和没有var关键字有啥差别?

js中三种作用域详解(全局,函数,块级)

C#10 的只读记录结构是不是保证与显式实现相同的字段大小和对齐方式?

C#C#中var关键字详解