写点什么

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

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

关注

评论

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

Databend 倒排索引的设计与实现

Databend

倒排索引

win版O&O Defrag (磁盘碎片整理工具)Professional / Server注册版

iMac小白

win版Power-user Premium(Excel插件)特别版

iMac小白

GQL图查询语言:高效处理复杂图数据

悦数图数据库

图数据库

win版IDimager Photo Supreme 2024(图片管理软件)激活版

iMac小白

Epubor Ultimate Converter(电子书格式转换工具)注册版

iMac小白

Decryption high performance :IPQ8072 and IPQ8072A chips detailed comparative ...

wifi6-yiyi

IPQ8072 IPQ8072A

Klocwork 2024.1新功能详解:验证平台功能提升、分析Bazel构建项目、MISRA C++:2023®编码标准

龙智—DevSecOps解决方案

klocwork perforce 静态代码分析工具

求职思维和招聘思维

老张

面试 求职 求职技巧

win版Native Instruments Kontakt(音乐采样工具)特别版

iMac小白

CQ 社区版 2.12.3 | 任务中心、访问申请、数据变更等多个模块大改版!

BinTools图尔兹

sql 数据库管理 数据脱敏 用户提权 数据变更

14个Flink SQL性能优化实践分享

华为云开发者联盟

sql flink 华为云 华为云开发者联盟 企业号2024年5月PK榜

ScrumMaster认证机构及CSM、PSM、RSM价值比较

ShineScrum

win版BurnAware Professional (光盘映像工具)特别版

iMac小白

win版BitRecover EML Converter Wizard(邮件转换软件)下载

iMac小白

win版MAGIX Samplitude Music Studio X8(音乐制作软件)特别版

iMac小白

win版Disk Sorter Pro / Ultimate / Enterprise (文件分析管理工具)特别版下载

iMac小白

win版Topaz Gigapixel AI(人工智能图片放大工具)特别版

iMac小白

Topaz Gigapixel AI中文 Topaz Gigapixel AI下载

自动化UI测试工具TestComlete现已集成AI功能,可自动执行可视化回归测试,减少误报,简化工作流程

龙智—DevSecOps解决方案

UI自动化测试 SmartBear

我们小公司,哪像华为一样,用得上IPD(集成产品开发)?

IPD产品研发管理

华为 产品 项目管理 产品研发

智能推荐系统有哪些特点?

悦数图数据库

大模型效能工具之智能CommitMessage

百度Geek说

百度 大模型 企业号2024年5月PK榜

从自动到智能:企业级问卷系统全开源,让调研更轻松~

XIAOJUSURVEY

开源 全栈 智能化 问卷 企业级

代码革命的先锋:aiXcoder-7B模型介绍

京东科技开发者

同样的APP为何在Android 8以后网络感觉变卡?

京东科技开发者

使用生成式AI的影视工作室所必备的版本控制系统Perforce Helix Core:助力更好地数据管理、分享和协作

龙智—DevSecOps解决方案

Perforce Helix Core 版本控制工具 生成式 AI 应用

在 2024 年如何启动一个 Node.js 项目

高端章鱼哥

卷爆短剧出海:五大关键,由AIGC重构

阿里云CloudImagine

云计算 AIGC 微短剧 短剧

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