Qwen3 惊喜上线阿里云百炼,8款模型全开源!点击免费领取 800万 tokens! 了解详情
写点什么

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

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

关注

评论

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

MySQL备份文件导入GreatSQL MGR环境为什么出现大量报错?

GreatSQL

C语言 AI 通义灵码 VSCode插件安装与功能详解

阿里巴巴云原生

C语言

Apache DolphinScheduler社区答疑Star第一期评选结果公示

白鲸开源

开源 Apache DolphinScheduler

近20款客服类SDK已适配鸿蒙5,覆盖电商、金融、教育、政务等行业

新消费日报

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

阿里云云效

php

多家企业领先实践证明:成功的软件国产替代不是个例!

用友BIP

AI 智能体 用友BIP 软件国产替代

MySQL 的四种社交障碍等级

秃头小帅oi

数造科技连续入选中国信通院「铸基计划」,领航产业数字化新标杆!

数造万象

AI 数据分析 数据治理 Data 大模型

微服务拆分的原则、时机、方法以及常见问题

秃头小帅oi

从测试到芯片全链条覆盖,慕尼黑上海电子展解码储能技术盛宴

极客天地

关于单条数据过长insert报错问题处理

TiDB 社区干货传送门

AI之下的KA经营协同:智能抓单 智能处理 高效协同 智能分析

用友BIP

AI 智能体 用友BIP KA经营协同

深入研究:京东商品列表API详解

tbapi

京东API接口 京东商品数据采集 京东商品列表API接口

C# LINQ 快速入门实战指南,建议收藏学习!

电子尖叫食人鱼

C#

中昊芯英亮相第十三届中国电子信息博览会,斩获创新金奖第二名

科技热闻

卤制品加工MES及生产管理智能化解决方案

万界星空科技

mes 食品MES 食品行业 卤制品行业 食品加工行业

如何使用AI辅助开发R语言

阿里巴巴云原生

R语言

如何使用AI辅助开发R语言

阿里云云效

从 DB-Engines 排名攀升看 TiDB 全球突破之路

PingCAP

人工智能 数据库 TiDB

如何使用通义灵码玩转Linux - AI编程助手提升效率

阿里云云效

Liunx

加速高水平研究型医院建设!以 AI 力量驱动医院科研管理效能提升

ModelWhale

人工智能 大数据 AI 医疗

一键解锁智能体50+场景,HR SaaS就选用友BIP企业AI全栈云

用友BIP

智能体 HR SaaS 用友BIP 企业AI 全栈云

相约2025慕尼黑上海电子展,展望可穿戴设备未来发展!

极客天地

如果单表数据量大,只能考虑分库分表吗?

伤感汤姆布利柏

“新E代弯道王”MAZDA EZ-6鹭羽白内饰焕新

科技热闻

千万级数据秒级响应!碧桂园服务技术引擎重构智慧社区新标杆

StarRocks

存算分离 StarRocks 湖仓一体 数据查询 OLAP 数据库

云备份技术解析:云容灾 CT-CDR 关键技术介绍

天翼云开发者社区

云备份 云灾备

添加DNS解析记录时,提示A和CNAME记录冲突是怎么回事?

国科云

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

阿里巴巴云原生

php

C语言 AI 通义灵码 VSCode插件安装与功能详解

阿里云云效

C语言

如何使用BOM和MRP解决生产物料管理混乱问题

积木链小链

数字化转型 智能制造 物料管理

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