写点什么

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

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

关注

评论

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

从人类基因到AI算法:智能进化的未来

天津汇柏科技有限公司

人工智能 AI

交易所系统平台开发流程及核心优势解析

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 公链开发代币开发

投诉问题处理系统(源码+文档+讲解+演示)

深圳亥时科技

虾皮(shopee)商品详情API接口详解

tbapi

Shopee shopee API shopee商品详情接口 shopee商品列表接口 shopee数据采集

DataWorks :Data+AI 一体化开发实战图谱

阿里云大数据AI技术

大数据 AI gpu 数据处理 Dataworks

VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 集成 Marvell AQC 网卡驱动定制版 (集成驱动版)

sysin

esxi

有限元分析是干什么的?ABAQUS软件怎么使用?

思茂信息

cst CST软件 CST Studio Suite

YashanDB告警日志管理

YashanDB

数据库 yashandb

Shopify对接API开发的主要功能

北京木奇移动技术有限公司

跨境电商 软件外包公司 shopify开发

万字干货分享最新AI指南:用LazyLLM把Deep Research做成赛博屠龙刀!

商汤万象开发者

AI AI Agent

大模型在软件测试中的应用论讨

京东科技开发者

智算生闽地,AI赋百景:2025数字中国创新大赛的AI生态启示录

脑极体

AI

基于 AI 代码助手 DeepSeek R1 分析 OOM 问题

CodeBuddy

程序员 腾讯 腾讯云 AI 代码助手 腾讯云代码助手 DeepSeek R1 模型

YashanDB运行日志管理

YashanDB

数据库 yashandb

YashanDB日志管理

YashanDB

数据库 yashandb

Shopify API对接的注意事项

北京木奇移动技术有限公司

跨境电商 软件外包公司 shopify开发

《Operating System Concepts》阅读笔记:p389-p407

codists

操作系统

人工智能丨35岁危机码农如何靠AI翻盘?这波浪潮不跟就淘汰!

测试人

人工智能

Shopify API的对接上线

北京木奇移动技术有限公司

跨境电商 软件外包公司 shopify开发

NineData云原生智能数据管理平台新功能发布|2025年2月版

NineData

性能优化 智能 数据管理平台 新功能 NineData

产线MES功能及解决方案详解--生产流程一体化管理

万界星空科技

制造业 mes 万界星空科技 产线mes 产线级mes

每一份投入,都该物有所值:观测云如何用按需计费重塑可观测性价值

观测云

可观测性

京东广告创意:高质量创意生成和千人千面的创意推荐

京东科技开发者

DApp开发需要多少钱?全面解析DApp开发成本

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

2025杭州国际智慧城市,物联网展览会

AIOTE智博会

物联网展 智慧城市展

Shopify API对接的测试

北京木奇移动技术有限公司

跨境电商 软件外包公司 shopify开发

【内部业务支撑&前瞻技术布局】One4All下一代生成式推荐系统

京东科技开发者

scheme 和 protocol 有什么区别

小曾同学.com

scheme protocol 流媒体协议

代练代打护航系统小程序的利与弊

DUOKE七七

MySQL uniapp tp6

YashanDB表的紧急恢复

YashanDB

数据库 yashandb

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