【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

  • 2008-05-29
  • 本文字数:1209 字

    阅读完需:约 4 分钟

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

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

2008-05-29 23:496078
用户头像

发布了 109 篇内容, 共 39.7 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

华为云主机安全助力企业种出“金葫芦”

IT资讯搬运工

华为云桌面说“流畅”的时候,究竟在说什么

科技云未来

华为发布IdeaHub S2系列,与华为云会议结合更强大!

科技怪咖

让视频会议更简单,华为云会议SmartRooms一站全搞定

sofiya

华为云安全云脑,让企业云化运营更放心

IT资讯搬运工

沉浸感拉满!这样的电影杀约起来

科技云未来

华为云桌面说“高清”的时候,究竟在说什么

科技云未来

华为云会议智能会议室助力财通证券加速数字化

科技怪咖

2022 Gartner RPA魔力象限,弘玑Cyclone位置飞跃国产RPA进击全球

王吉伟频道

RPA 机器人流程自动化 Gartner RPA魔力象限 弘玑Cyclone

每日一R「10」数据结构(一)智能指针

Samson

8月日更 ​Rust

Kubernetes Nginx配置热加载

CTO技术共享

开源 签约计划第三季

3000人无缝连接,WeLink助力华荣科技全场景数字化办公

神奇视野

2022各互联网大厂面经及总结+大厂Java岗面试真题解析(进大厂必看攻略)

程序知音

Java 程序员 Java 面试 后端技术 八股文

IPv6中的隧道技术

穿过生命散发芬芳

ipv6 8月月更 隧道技术

游族马寅龙:常见信息安全风险及应对方案

声网

网络安全 创业讲堂

RocketMQ高可用设计之异步刷盘

急需上岸的小谢

8月月更

头脑风暴:最长重复子数组

HelloWorld杰少

AIRIOT答疑第9期|AIRIOT平台服务于哪些客户?

AIRIOT

低代码 物联网 低代码,项目开发

微信小程序开发速览

乌龟哥哥

8月月更

网红50万卖微信号被判交易无效:如何监管互联网账号交易市场

石头IT视角

沟通不受限,审批不堆积 深大智能通过华为云WeLink+OA实现办公提速

神奇视野

Kubernetes服务的注册与发现

CTO技术共享

签约计划第三季

政企视频会议首选,华为云OneMeeting全场景视频会议解决方案正式发布

sofiya

华为云会议,用高效联接推进工业企业数字化转型

sofiya

时尚品牌玛丝菲尔,选择华为云会议的3个理由

sofiya

企业搭建知识库的重要性,你了解多少?

Geek_da0866

ITIL服务支持5个运营级流程简单介绍

阿泽🧸

ITIL 8月月更

用户权限-Linux系统用户管理

Albert Edison

Linux centos 运维 用户权限 8月月更

Kubernetes 核心组件

CTO技术共享

开源 签约计划第三季

如何用紧凑型语音表征打造高性能语音合成系统

小红书技术REDtech

深度学习 语音合成 自编码器 表征学习 语音表征

创建知识库使您的客户能够体验自助服务

Geek_da0866

C#争论:什么时候应该使用var?_.NET_Jonathan Allen_InfoQ精选文章