【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

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

关注

评论

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

MySQL常用图形管理工具

小齐写代码

新华网专访王文京:“数据驱动 智能运营”是企业数智化的全新阶段

用友BIP

数据驱动

selenium基础语法详解。

百度搜索:蓝易云

Java Python Web API selenium

AI见证每一跳的闪耀!百度成为中国国家跳水队人工智能合作伙伴

飞桨PaddlePaddle

人工智能 百度

Spring Boot是什么?它的优点是什么?

百度搜索:蓝易云

云计算 spring Linux 运维 Spring Boot

苹果mac清理垃圾软件哪个好 App Cleaner & Uninstaller v8.2.3 破解版下载

晴雯哥

硬件信息查看软件 EtreCheckpro免激活最新版

胖墩儿不胖y

Mac软件 系统维护软件

Zebec Protocol 薪酬支付工具 WageLink 上线,掀新一轮薪酬支付浪潮

西柚子

你真的了解你的团队吗? ONA告诉你真相

用友BIP

人才发展

大模型的幻觉 (Hallucination) 因何而来?如何解决幻觉问题?

Baihai IDP

人工智能 AI 大模型 白海科技 大模型幻觉

用Python实现微信多开,1行代码免费用

程序员晚枫

Python 微信

acdsee看图软件下载 ACDSee Photo Studio中文破解版 v9.3.2859 Mac版

晴雯哥

什么是特权账号?

尚思卓越

网络安全 数据安全 特权账号管理 PAM

Final cut pro最新版本 fcpx视频剪辑软件 v10.6.10 中文破解版下载

晴雯哥

初探亚马逊 AI 编程助手 CodeWhisperer

亚马逊云科技 (Amazon Web Services)

人工智能’ 云上探索实验室 Amazon CodeWhisperer

如何发现更多比特币大户钱包地址?以bitget 钱包为例

鳄鱼视界

从基础到实践,回顾Elasticsearch 向量检索发展史

华为云开发者联盟

人工智能 深度学习 华为云 华为云开发者联盟

我和极客时间的故事

i查拉图斯特拉如是说

我和极客时间的故事

Linux的挂载介绍

智趣匠

简单好用的图片查看软件:EdgeView 4中文激活最新版

mac大玩家j

Mac软件 图片查看器 图片查看软件

全网最详细4W字Flink全面解析与实践(上)

Java随想录

Java 大数据 flink

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

华为云开发者联盟

人工智能 华为云 大模型 昇腾CANN 华为云开发者联盟

Programming abstractions in C阅读笔记:p181-p183

codists

用友x德勤 | 引领全球化潮流,用友与德勤携手助力中企出海

用友BIP

优测云测试平台 | 有效的单元测试

优测云服务平台

测试 单元测试 云平台 测试开发

东莞理工网安学院“火焰杯”软件测试高校就业选拔赛颁奖典礼

测试人

软件测试

如何发现更多比特币大户钱包地址?以bitget 钱包为例

威廉META

ARTS-WEEK10(23.10.16-23.10.22)

EchoZhou

掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具

SEAL安全

集群 故障排除 kubernetes 运维 企业号10月PK榜

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