写点什么

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

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

关注

评论

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

从垃圾回收的角度解析ThreadLocal

喝水不抬头

企业级低代码平台的架构范式转型研究

JeeLowCode低代码平台

低代码 低代码前端 低代码缺点 低代码, 低代码选择

chrony时间同步软件介绍

天翼云开发者社区

chrony 时间同步软件

CAD等分对象方法

极客天地

CAD如何调整动态块参数显示大小

极客天地

网页版脑图工具有哪些?5个办公必备的思维导图盘点!

职场工具箱

AI 思维导图 办公软件 AIGC 脑图

食品行业龙头哈尔滨裕昌食品签约用友,迈向业财一体新未来

用友智能财务

财务 会计

DePIN 之于传统基础设施,正如同 DeFi 之于传统金融

PowerVerse

defi web3 DePIN

GUI Tracker采集工具,Agent时代的数据利器

澳鹏Appen

智能体

JavaScript 常用的高阶函数

雄鹿 @

JavaScript

Nexpose 8.2.0 for Linux & Windows - 漏洞扫描

sysin

Nexpose

等保合规体系化建设

黑龙江陆陆信息测评部

大语言模型火爆的今天,我们为什么还要拥抱世界模型?

脑极体

AI

Orpheus 语音模型支持中文预训练和微调,模拟细微语音特征;谷歌版 MCP 来了,A2A 协议让不同厂商 Agent 协作

声网

华为云智能驾驶用户大会高阶智驾量产成焦点,产业链生态合作再加码

极客天地

行业SOTA,京东首个自研十亿级时序大模型揭秘

京东零售技术

CAD复制到excel如何调整图纸格式

极客天地

LLMs.txt:让大模型更懂你的 Web 文档

Baihai IDP

程序员 AI LLM Baihai IDP GenAI

故障定位系列-3-容器资源故障

乒乓狂魔

可观测性 故障定位 AIOPS

从手工测试到AI测试工程师,揭秘大厂20-50K高薪岗位核心技术栈

测试人

人工智能

我们又忘了,人形机器人≠AI

脑极体

AI

在.NET中使用正则表达式匹配特殊字符[和]——双重转义的技巧

雄鹿 @

.net csharp

这是一个文章标题

爱写字的阿城

[直播预告]StarRocks 小课堂 监控告警全覆盖,别等服务挂了才处理!

StarRocks

StarRocks 数据库· 数据异常 镜舟科技 数据警告

从传统冶金到智慧工厂:中国恩菲用IoTDB破解有色金属行业数据难题

Apache IoTDB

工作搁置重启:引发的决策深思

TechLead Studio

决策管理

2024公有云大模型调用量,火山引擎中国第一!

极客天地

阿里云CDN应对DDoS攻击策略

网络安全服务

阿里云 CDN 服务器 DDoS DDoS 攻击

为什么我们需要淘宝商品详情数据 API?

代码忍者

淘宝API接口

从Grok-3霸榜谈起:高难度题库如何助力AI推理能力飞跃?

澳鹏Appen

数据集 大模型 题库

ClickHouse 的“独孤九剑”:极速查询的终极秘籍

京东零售技术

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