BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

C#争论:什么时候应该使用var?

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 张逸 关注 12 他的粉丝 发布于 2008年5月31日. 估计阅读时间: 4 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。
C# 3新增了关键字“var”。在编译器能明确判断变量的类型时,它允许对本地类型进行推断。然而,对于何时应该使用它却存在某些争论。

开发IDE工具的公司ReSharper的Ilya Ryzhenkov总结了使用var的一些好处

        1. 它有利于更好地为本地变量命名。
        2. 它有利于设计更好的API。
        3. 它促使对变量进行初始化。
        4. 它消除了代码的混乱。
        5. 它不需要using指示符。

RSS Bandit的Dare Obasanjo对此则不敢苟同。由于var给他的开源项目(译注:RSS Bandit项目使用了ReSharper)带来了不利影响,他随后发表了对Ryzhenkov观点的回应 。他回击道:

有趣的是,这里列出的所有“好处”,主要针对的不仅是形式上的改进,而且它们之间还相互矛盾。例如,Ryzhenkov宣称var有利于对“更好地为本地变量命名”,这实际上意味着迫使开发人员使用更长的匈牙利风格的变量命名。颇为滑稽的是,这种长的变量名完全会加剧代码的混乱,因为这样的变量名是随处可见的,相比而言,只有在声明变量的时候显示单个的类型名,会保持代码的整洁。那种var有利于“设计更好的API”的观点实际上如出一辙。因为这种观点主张,如果要求开发人员使用更长的描述性属性名(例如使用XmlNode.XmlNodeName,而不是XmlNode.Name),就会达到改进的目的。或许应该有人告知ReSharper的人员,这种将类型信息编码到变量名中的方式实在是糟透了,而这也正是我们首选强类型编程语言例如C#的原因所在。

此外,鼓励变量初始化的主张也显得有些不可思议,因为C#编译器对此是强制要求的。更重要的是,在使用变量之前,通常需要将变量初始化为null,而var关键字对此却不支持。

官方C#语言参考中的一行内容佐证了Dare的观点:

过度使用var会使得源代码晦涩难懂。只有在必要的时候,才推荐使用var,也就是说当变量用来存储一个匿名类型或者匿名类型集合的时候。

对于那种var会降低代码可读性的抱怨,并非人人都赞同。Arnon Rotem-Gal-Oz写道:

对于代码可读性的主张,我更倾向于专注更加强大的方法,例如保持方法简短,有意义的方法和变量名,以及支持测试(这实际上可以帮助你理解代码是如何运作的……)不仅如此,如果你真的非常非常需要代码可读性,ReSharper工具可以在你的鼠标移动到var关键字之上时,告诉你它的类型;)

Chris Sutton似乎更进一步,含蓄地指出类型是无关紧要的

那么,我的建议是只有当你不知道类型的时候,才使用var。这里是我不同的见解和用法。请看如下代码片断:

var procs = from p in ServiceController.GetServices()
where p.Status == ServiceControllerStatus.Running
select p;
procs.ToList().ForEach(p=> Console.WriteLine(p.ServiceName));

procs的类型无疑为IEnumerable<ServiceController>,然而这却与我无关。我首先关注的是procs是一个列表,列表中的每一项都具有一个属性ServiceName。潜在的类型对于编译器很重要,而那些不得不去阅读代码的人们却不是编译器,对吗?

查看英文原文:C# Debate: When Should You Use var?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

呵呵 by 源头 西水

这帮人故意打口水仗吧,呵呵

讨论很重要 by Yuan Max

我确得无论对任何一行,讨论是非常重要的。国内的技术缺乏的就是这种“口水仗”。

test by gr w

test

我首先关注的是procs是一个列表 by 铁成 谢

procs的类型无疑为IEnumerable<ServiceController>,然而这却与我无关。我首先关注的是procs是一个列表,列表中的每一项都具有一个属性ServiceName。潜在的类型对于编译器很重要,而那些不得不去阅读代码的人们却不是编译器,对吗?

这里分析的很好..人有人的关注点,适当时候应用还是挺不错的.</servicecontroller>

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

4 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT