C# 'var' keyword versus explicitly defined variables
我目前正在使用Resharper的30天试用期,到目前为止,我对它的建议印象深刻。然而,有一个建议让我困惑。
当我显式定义变量时,例如:
1
| List <String> lstString = new List <String>(); |
重新竖起一条弯弯曲曲的绿线,告诉我:
Use implicitly type local variable declaration.
如果我遵循它的建议,resharper将代码行更改为:
1
| var lstString = new List <String>(); |
那么,将List改为var是否会带来某种性能提升,或者这仅仅是resharper的一个特性?我一直被教导,明确定义一个变量,而不是使用一个动态变量,更为理想。
- var与动态关键字不同,编译器也会将var关键字转换为实际的类型句柄
So, is there some sort of performance gain to be had from changing the List to a var
不,但这不是重构的唯一有效原因。更重要的是,它消除了冗余,使代码更短,而不会失去清晰度。
I've always been taught that explicitly defining a variable, rather than using a dynamic, is more optimal.
你误解了var的意思。这不是动态的,因为它产生相同的输出。它只是意味着编译器自己计算出变量的类型。它显然能够这样做,因为这是用于测试类型安全性和正确性的相同机制。
它还消除了完全无用的代码重复。对于简单类型,这可能不多。但是考虑一下:
1
| SomeNamespace .AndSomeVeryLongTypeName foo = new SomeNamespace .AndSomeVeryLongTypeName(); |
显然,在这种情况下,将名称加倍不仅是不必要的,而且实际上是有害的。
- 感谢您澄清"var"与dynamic不同,我没有意识到这一点。
- +一个很好的解释。
不。它们发出完全相同的IL。
只是风格问题。
var的优点是,您可以更容易地更改函数的返回类型,而不必更改源代码的其他部分。例如,将返回类型从IEnumerable更改为List。但是,它可能使引入错误变得更容易。
- 实际上,这是对var的一种糟糕的使用。它应该只在类型从上下文中不明显时使用。如果可以在不更改方法名称的情况下更改方法的返回类型,则不应使用var,因为所涉及的类型不明显。
- @斯蒂芬:当表达式的类型不是很明显时,为什么会很糟糕?
- 将var用作不明确的符号会严重降低可读性和可理解性。在阅读代码时,快速掌握对象的类型会导致更快、更高的理解力。
- 我同意斯蒂芬的观点。我不喜欢不必要的var,你只需要写double,int,float,string,page。我只在非常长的类型名和匿名类型上使用var。var通常会降低可读性
- @斯蒂芬·梅赫拉德:这是主观的。var通常不会降低可读性和可理解性。我发现变量的名称比类型更重要。如果给定一个好名字,在编写var时写出一个类型几乎总是违反dry规则。
- 名称应该描述对象不是什么类型(匈牙利语,有人吗?)当然,这两者之间有一些重叠,但是为什么要无缘无故地删除信息。Dry是一句很好的格言,应该时刻牢记在心,但不要在任何情况下都将其提升到一个规则。
- @斯蒂芬:为什么无缘无故重复信息?别麻烦了,我显然不会说服你的。我的观点是,在没有匿名类型的情况下使用var是一个品味问题。
var关键字实际上并不声明具有动态类型的变量。变量仍然是静态类型,它只是从上下文推断类型。
当您有一个长的类型名时,这是一个很好的快捷方式(通用类型名可以是长的)
- 最重要的是,您不能像处理真正的动态类型那样,一瞬间将int赋给var,一瞬间将字符串赋给var。一旦设置了类型,它就被卡住了。你仍然得到完全的智能感知支持和一切。
更少的类型=更多的生产力:)
- 实际上:可读性较低=生产率较低
- 很好,那么VaR就更好了。var的可读性通常更高,这仅仅是因为要做的读取要少得多。
- 只有在创建具有非常长(通常是通用)类型名的对象的情况下,var才更具可读性,正如konrad所建议的那样。在那里,var几乎可以立即与类型匹配,删除大量额外字符提高了可理解性。
- 在大多数其他情况下,特别是在使用var声明由返回值初始化的变量的情况下,由于引入不明确的符号而导致的可理解性损失会大大降低可读性。