写点什么

关于 C#中非可空类型的一点建议

  • 2012-10-03
  • 本文字数:807 字

    阅读完需:约 3 分钟

如果非期望值是问题所在的话,那么我们就应该努力消除它们。尽管我们几乎从未期望过null(空),然而类型系统却强迫我们装出一副很需要它的样子。——Craig

尽管这句话已经被.NET 开发者在这些年来讲过无数次。然而修正此问题并非易事,不仅仅是在变量上拍个属性或其他修饰那么简单。更严峻的挑战之一就是,要是T为非可空引用类型的话,那么default<T>该如何处理。Craig 写道,

这里的根本问题在于 C#中根深蒂固的假设:该假设即每种类型都有默认值。试想一下:如果T没有(或可能没有获得)默认值,那么编译器在计算default(T)、初始化类型 T 的字段、或初始化某个类型 T 的新数组中的数组项时就会无值可用。由于一谈到非可空引用类型就会涉及此问题,尽管某些引用类型拥有适当的非空默认值(例如非空字符串类型的默认值可能是空字符串),然而对于大多数引用类型而言却并非如此。试想一下:IEnumerator<int>的默认非空值是什么?IObservable<bool>呢?UserControl呢?NetworkStream呢?答案很简单,它们没有任何默认非空值。而你能做的最好方法就是,给出某种模仿实例,即一旦你尝试使用该实例就会导致失败……不过我们已经有了那种实例,并称之为null(空)。

在题为非可空类型对 C#:修正十亿美元的错误的文章中,Craig 引入了两个新概念:

  • T!用于指示类型 T 为非可空类型。这也可以用于普通类型及类型参数。
  • withdefault(T)用于把非可空引用类型参数转变为相应的可空类型参数。

要是需要构建私有字段或数组,就将其类型声明为withdefault(T),而不是类型T。然后在读取该字段或数组时,可以将其重新强制转换非可空类型T。这种强制转换本身是不安全的,而且倘若没有正确构造就有可能抛出异常,不过一旦成为了非空,开发者便可如鱼得水。要了解这样做所产生的后果,最好还是通过 Craig 文章中的例子来解释。

如果对此主题有兴趣,可以在用户反馈网站上对非空引用类型的建议进行投票

查看英文原文: A Proposal for Non-Nullable Types in C#

2012-10-03 13:092161
用户头像

发布了 55 篇内容, 共 21.0 次阅读, 收获喜欢 1 次。

关注

评论

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

嘉为蓝鲸监控中心:助力大型运营商解决烟囱工具式监控难题

嘉为蓝鲸

监控 运维工具 IT 运维

2024IT市场权威榜单发布!腾讯云TBDS斩获两大奖项!

腾讯云大数据

TBDS

IPv6改造技术:隧道技术的原理和优缺点

国科云

淘宝商品列表数据接口实战:构建实时比价系统

tbapi

淘宝商品列表数据接口 淘宝商品数据采集 关键词搜索淘宝接口

为什么说SD-WAN能省钱?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

实力认可|心大陆多智能体入围“2024DIIRC大模型十大典范案例”服务商!

心大陆多智能体

软件测试学习笔记丨Vue使用axios

测试人

Vue 软件测试 自动化测试 测试开发

从票务到游戏:Celestia 首届黑客松亮点项目盘点

TechubNews

2024 年 5 月区块链游戏研报:市值增长、玩家参与变迁、迷你游戏兴起

Footprint Analytics

链游

鹏华基金研运一体化平台落地实践,探索数字化转型

嘉为蓝鲸

数字化转型 一体化 一体化平台

阿里巴巴1688商品详情API返回值应用探索:电商数据驱动的市场趋势预测

技术冰糖葫芦

API Explorer API 接口 API 策略

嘉为蓝鲸告警中心:助力大型保险集团实现告警规范管理

嘉为蓝鲸

告警体系 运维工具 IT 运维

如何用二维码进行来访登记?这个模板帮你轻松实现!

草料二维码

草料二维码 访客登记 来访登记 访客来访二维码 来访二维码

如何用Vue3构建一个交互式3D图

秃头小帅oi

德国电动汽车生产:欧洲第一,世界第二

财见

火山引擎视频云发布赛事直播方案,延时缩短至1s

新消费日报

低代码开发:智能财务系统开发应用

不在线第一只蜗牛

低代码

利用 AI 机器学习,轻松实现化合物配比超优化解决方案

Altair RapidMiner

人工智能 机器学习 数据分析 大模型

【AI法官】人工智能判官在线判案?

AppBuilder

第十二届双态IT用户大会·嘉为蓝鲸平台工程专题研讨会圆满落幕!

嘉为蓝鲸

DevOps BizDevOps 一体化运维

推荐十个优秀的ASP.NET Core第三方中间件,你用过几个?

不在线第一只蜗牛

asp.net 后端 中间件

关于C#中非可空类型的一点建议_C#_Jonathan Allen_InfoQ精选文章