速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

关注

评论

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

数字化转型实践:世界级2B数字化营销的方法框架

雨果

数字化转型 DaaS数据即服务

七日算法先导(一)—— 数组

工程师日月

8月月更

数据中台建设(七):数据资产管理

Lansonli

数据中台 8月月更

开源一夏|基于ArkUI eTS开发的坚果食谱(NutRecipes)

坚果

开源 HarmonyOS OpenHarmony OpenHarmony应用开发 8月月更

设计消息队列存储消息数据的MySQL表格

Geek_7a789a

表达式引擎在转转平台的实践

转转技术团队

表达式 引擎

语音聊天app源码——语音聊天派对

开源直播系统源码

软件开发 直播系统源码 开源源码 语音聊天源码 一对一语音聊天系统

JAVA编程规范之安全规约

源字节1号

后端开发 网站开发

易周金融分析 | 银行ATM机智能化改造提速;互联网贷款新规带来挑战

易观分析

金融 分析

PanGu-Coder:函数级的代码生成模型

华为云开发者联盟

人工智能

Web3.0:构建 NFT 市场(一)

devpoint

区块链 NFT 7月月更

elasticsearch安装和使用ik分词器

程序员欣宸

Java Elastic Search 8月月更

学习Java的网站

玄兴梦影

Java core

OpenHarmony高校技术俱乐部计划发布

科技汇

未来源码 | 终于有人把大数据、机器学习、数据科学讲明白了

MobTech袤博科技

数据挖掘 机器学习 大数据

英特尔全方位打造算力基础,助推“算”赋百业

科技之家

50W+小程序开发者背后的数据库降本增效实践

石云升

数据库 severless 全球架构师峰会 ArchSummit 8月月更

如何设计高可用高性能中间件 - 作业

阿拉阿拉幽幽

重庆市大力实施智能建造,推动建筑业数字化转型,助力“建造强市”

科技热闻

大众碰到点评的一个字体反爬,落地技术也是绝了

梦想橡皮擦

Python 爬虫 8月月更

用户体验 | 如何度量用户体验 ?

易观分析

用户体验

10年稳定性保障经验总结,故障复盘要回答哪三大关键问题?|奈雪的茶李道兵

TakinTalks稳定性社区

博弈论(Depu)与孙子兵法(42/100)

hackstoic

博弈论

mysql进阶(二十二)MySQL错误之Incorrect string value中文字符输入错误问题分析

No Silver Bullet

MySQL 特殊字符 8月月更

C#/VB.NET 将PPT或PPTX转换为图像

Geek_249eec

C# SVG PPT png VB.NET

MVVM响应式

flow

8月月更

新书上市 |《谁在掷骰子?》在“不确定性时代”中确定前行

图灵教育

从RabbitMQ平滑迁移到RocketMQ技术实战

vivo互联网技术

RocketMQ RabbitMQ 消息队列 消息中间件 Apache RocketMQ

轮询和长轮询的区别

CRMEB

首届中国计算机学会芯片大会召开,宋继强分享英特尔最新底层技术创新进展

科技之家

Prometheus 监控什么时候可以使用 PushGateway

耳东@Erdong

Prometheus PushGateway 7月月更

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