如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

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:496835
用户头像

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

关注

评论

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

人工智能丨ChatGPT 的 API 使用

测试人

软件测试

读友好的缓存淘汰算法

百度Geek说

架构 页面缓存 企业号 8 月 PK 榜 淘汰算法 广告检索

LED显示屏行业发展现状与未来展望

Dylan

行业 LED LED display LED显示屏 市场

Python爬虫实战:利用代理IP爬取百度翻译

袁袁袁袁满

人工智能|ChatGPT 的 API 使用

测吧(北京)科技有限公司

测试

京东商品详情数据接口(JD.item_get)丨京东API接口指南

tbapi

京东API接口 京东商品详情接口 京东商品详情数据采集 京东商品API 京东商品详情API

三大产品板块快速发展,零信任价值备受认可

芯盾时代

iam 零信任 微隔离 sdp

英伟达新型AI芯片将推迟三个月发布,谷歌微软坐不住了!第二位人类患者植入脑机芯片!马斯克表示一切顺利|AI日报

可信AI进展

人工智能

白兔与魔法师

蓬蒿

王阳明 成长感悟

第62期|GPTSecurity周报

云起无垠

Databend 开源周报第 156 期

Databend

监控系统原理揭秘-数据运算篇

京东科技开发者

适配器模式在 Go 语言中的应用

江湖十年

Go 面试 设计模式 适配器模式 后端、

无缝数据整合:京东商品详情API在多平台同步中的应用

代码忍者

API 接口 API 文档 API 测试

RUM技术探索:前端监控数据采集与实践

乘云数字DataBuff

前端监控 #RUM

如何在 K8s 中实现指定数据库实例下线?

小猿姐

数据库 Kubernetes 容器 云原生

深度解读KubeEdge架构设计与边缘AI实践探索

华为云开发者联盟

AI 边缘计算 kubeedge 企业号 8 月 PK 榜 2024企业号8月pk

【YashanDB知识库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发

YashanDB

yashandb 崖山数据库 崖山DB

引入JaCoCo导致的类型转换问题分析

京东科技开发者

【AIGC】 0成本学习:AI工作流生成Joy(ComfyUI)

京东科技开发者

阿里云2024云栖大会门票开抢啦!数量有限,先到先得!

MasterInTech

万界星空科技MES系统与ERP的对接

万界星空科技

系统集成 ERP mes 万界星空科技 系统对接

万界星空科技低代码云mes核心功能详解!建议收藏!

万界星空科技

低代码平台 mes 云mes 万界星空科技 低代码云MES

闪耀STIF2023国际科创节,望繁信科技荣获年度行业创新典范奖

望繁信科技

人工智能 大数据 数字化转型 流程挖掘 流程智能

【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks

YashanDB

yashandb 崖山数据库 崖山DB

虚拟ECU:纯电动汽车发展下的新选择

DevOps和数字孪生

电动汽车 虚拟ECU

阿里云位居 IDC MarketScape 中国实时湖仓评估领导者类别

阿里云大数据AI技术

大数据 阿里云 IDC 实时湖仓

基于人工智能的代码分析与 Bug 检测实战

测吧(北京)科技有限公司

测试

如何建立测试团队的知识库

老张

团队管理 软件测试 质量保障 知识库

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