写点什么

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

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

关注

评论

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

架构学习笔记:微服务架构与SOA架构

风翱

微服务 SOA 5月日更

选择排序&插入排序 - DAY 15

Qien Z.

排序算法 插入排序 5月日更

redis在微服务领域的贡献

捉虫大师

redis dubbo RPC 协议 注册中心

小傅哥,一个有“副业”的码农!

小傅哥

Java 小傅哥 技术成长 码农副业

Nginx调试必备的几种技能

运维研习社

nginx 运维 实用技巧 5月日更

微服务注册中心:Consul——概念与基础操作

程序员架构进阶

微服务 Consul 注册中心 28天写作 5月日更

把数字人民币打造成全球最佳的央行数字货币

CECBC

金融

【Flutter 专题】120 Flutter & 腾讯移动通讯 TPNS~

阿策小和尚

5月日更 Flutter 小菜 0 基础学习 Flutter Android 小菜鸟

ThreadLocal内存溢出代码演示和原因分析!

王磊

Java 多线程

华为推送踩坑记录

mengxn

密码学系列之:memory-hard函数

程序那些事

加密解密 密码学 程序那些事

网络攻防学习笔记 Day25

穿过生命散发芬芳

5月日更 网络攻防

CG行业云渲染服务的演进之路

华为云开发者联盟

公有云 CG 渲染 云渲染 影视动画

python 常用模块详解

若尘

模块 Python编程 5月日更

聊聊数据分析

数据社

数据分析 5月日更

Java设置Filter过滤了CSS等静态文件的问题

空城机

Java 5月日更

☕【JVM 技术之旅】攻克技术盲点之“JVM常量池们“

洛神灬殇

JVM 5月日更 字符串常量池 静态常量池 运行时常量池

记一次与写作朋友的线下沙龙

架构精进之路

技术交流 杂记 5月日更

Dubbo 路由规则之标签路由

青年IT男

dubbo

通用连接池帮你解决资源管理难题

万俊峰Kevin

MySQL redis mongodb pool Go 语言

掌握学习方法,成为技术大牛

实力程序员

腾讯云实名认证流程

三掌柜

5月日更

320万开发者在用的飞桨,全新发布推理部署导航图:打通AI应用最后一公里

百度大脑

人工智能 飞桨

5分钟速读之Rust权威指南(九)

wzx

rust

“丝绸之舟”创新区块链帮扶模式

CECBC

区块链 丝路

Go 并发编程 — 深度剖析 sync.Pool 源码级原理

奇伢云存储

并发编程 云存储 Go 语言

k8s 集群下微服务 pod 的各种指标信息监控

Damon

微服务 5月日更

Bzz算力挖矿系统开发节点部署

薇電13242772558

数字货币 算力

访问控制

escray

学习 极客时间 安全 5月日更 安全攻防技能30讲

从寻人到航天,科技与公益的下一个交汇点正在“星辰”中诞生

脑极体

Feed流系统重构-架构篇

勇哥java实战分享

架构 RocketMQ 分库分表 ShardingJDBC redisson

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