写点什么

关于 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:091837
用户头像

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

关注

评论

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

协同高效运转,华为云桌面助力企业数字化转型!

科技说

架构实战营第十期模块三作业

刘博

单测在商家前端业务中的实践

得物技术

架构 前端 Web 测试 单元测试 12 月 PK 榜

微信业务架构图

lory(侯保国)

学习下Redis内存模型

京东科技开发者

Java 前端 内存 数据存储 内部编码

AI技术赋能数智化转型,激发企业变革创新

用友BIP

架构实战营第10期模块3作业

Geek_4db2d5

内卷时代,华为云引领移动办公新潮流

清欢科技

卓越实力备受认可 HashData再获权威大奖

酷克数据HashData

金融科技 数据库·

基于Redis实现DelayQueue延迟队列设计方案(附源码)

石臻臻的杂货铺

redis

华为云桌面,如何助力企业云上轻松办公

科技怪授

云桌面

现在即未来,华为云桌面引领桌面变革新潮

科技说

程序员是“短命”职业吗?年龄大了是不是没前途?

千锋IT教育

5大理由告诉你,为什么选择华为云桌面

与时俱进的时代

物联网设备端的传感器数据如何实时上报到云平台——实践类

阿里云AIoT

安全 物联网 物联网安全 技术标签

由浅入深剖析JDK源码!美团大牛手撸并发原理笔记真香

Java永远的神

程序员 并发编程 后端 jdk源码 架构师

数据可视化软件有哪些?

优秀

数据可视化工具

阿里最新产:SpringCloud微服务架构进阶笔记(2023终极版)

程序员小毕

程序员 微服务 后端 架构师 java面试

学生系统架构图

lory(侯保国)

阿里云IoT物联网实例讲解——实践类

阿里云AIoT

阿里云 物联网平台 IoT 设备管理

【漏洞分析】Apache ShardingSphere-Proxy <5.3.0 身份认证绕过

墨菲安全

开源 安全漏洞 软件供应链安全

运维自动化之监控平台

大V

DevOps 运维自动化 监控报警

数据库原理及MySQL应用 | 数据表操作

TiAmo

:MySQL 数据库 数据库· 12月月更

【世界杯黑技术专题】「原理探索专题」一文解读一下“卡塔尔世界杯”的先进技术之半自动越位技术SAOT+比赛用球Al Rihla

洛神灬殇

12月日更 世界杯 世界杯黑科技

数字孪生赋能智慧港口解决方案,助力港口数字化转型

袋鼠云数栈

数字孪生

天猫联合瓴羊、贝恩,打造“产品致胜”的DTC发展模式

瓴羊企业智能服务

Mysql到TiDB迁移,双写数据库兜底方案

京东科技开发者

数据库 开源 开发 迁移 双写数据库

全网最全 java 进制转换详解

千锋IT教育

TCP-SYN超时重传问题排查

Kevin Wu

高并发 网关 TCP协议

Elasticsearch查询及聚合类DSL语句宝典

京东科技开发者

数据库 存储 ES dsl 查询语句

「实操」结合图数据库、图算法、机器学习、GNN 实现一个推荐系统

NebulaGraph

推荐系统 图数据库 图算法 GNN

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