C# 新增了关键字var在编译器能明确判断变量的类型时它允许对本地类型进行推断然而对于何时应该使用它却存在某些争论
开发IDE工具的公司ReSharper的Ilya Ryzhenkov总结了使用var的一些好处
它有利于更好地为本地变量命名
它有利于设计更好的API
它促使对变量进行初始化
它消除了代码的混乱
它不需要using指示符
RSS Bandit的Dare Obasanjo对此则不敢苟同由于var给他的开源项目(译注RSS Bandit项目使用了ReSharper)带来了不利影响他随后发表了对Ryzhenkov观点的回应 他回击道
有趣的是这里列出的所有好处主要针对的不仅是形式上的改进而且它们之间还相互矛盾例如Ryzhenkov宣称var有利于对更好地为本地变量命名这实际上意味着迫使开发人员使用更长的匈牙利风格的变量命名颇为滑稽的是这种长的变量名完全会加剧代码的混乱因为这样的变量名是随处可见的相比而言只有在声明变量的时候显示单个的类型名会保持代码的整洁那种var有利于设计更好的API的观点实际上如出一辙因为这种观点主张如果要求开发人员使用更长的描述性属性名(例如使用XmlNodeXmlNodeName而不是XmlNodeName)就会达到改进的目的或许应该有人告知ReSharper的人员这种将类型信息编码到变量名中的方式实在是糟透了而这也正是我们首选强类型编程语言例如C#的原因所在
此外鼓励变量初始化的主张也显得有些不可思议因为C#编译器对此是强制要求的更重要的是在使用变量之前通常需要将变量初始化为null而var关键字对此却不支持
官方C#语言参考中的一行内容佐证了Dare的观点
过度使用var会使得源代码晦涩难懂只有在必要的时候才推荐使用var也就是说当变量用来存储一个匿名类型或者匿名类型集合的时候
对于那种var会降低代码可读性的抱怨并非人人都赞同Arnon RotemGalOz写道
对于代码可读性的主张我更倾向于专注更加强大的方法例如保持方法简短有意义的方法和变量名以及支持测试(这实际上可以帮助你理解代码是如何运作的……)不仅如此如果你真的非常非常需要代码可读性ReSharper工具可以在你的鼠标移动到var关键字之上时告诉你它的类型;)
Chris Sutton似乎更进一步含蓄地指出类型是无关紧要的
那么我的建议是只有当你不知道类型的时候才使用var这里是我不同的见解和用法请看如下代码片断
var procs = from p in ServiceControllerGetServices()
where pStatus == ServiceControllerStatusRunning
select p;
procsToList()ForEach(p=> ConsoleWriteLine(pServiceName));
procs的类型无疑为IEnumerable然而这却与我无关我首先关注的是procs是一个列表列表中的每一项都具有一个属性ServiceName潜在的类型对于编译器很重要而那些不得不去阅读代码的人们却不是编译器对吗?
查看英文原文C# Debate: When Should You Use var?