阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

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

关注

评论

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

应用性能管理与链路追踪的关系

穿过生命散发芬芳

链路追踪 7月月更

C语言入门(一)

逝缘~

c 7月月更

Binder通信过程

北洋

Andriod 7月月更

Cgroup Cpuset子系统

总想做点什么

正则表达式(二)

Jason199

正则表达式 js 7月月更

2000字教你如何玩转Linux man命令,隐藏技能非常nice

wljslmz

Linux 运维 man 7月月更

Nginx Http模块是如何处理请求的?

Ethan

ngnix

想要治好水,龙王也要拜拜这朵云

白洞计划

解读《深入理解计算机系统(CSAPP)》第4章处理器体系结构

小明Java问道之路

编译原理 编译器 指令集 7月月更 ISA

❤️❤️❤️爱了爱了!这样的文字动画让你爱不释手!

岛上码农

flutter ios 前端 安卓开发 7月月更

前端与HTML

小恺

7月月更

Redis stream性能测试实践【Java版】

FunTester

Java多线程案例之线程池

未见花闻

7月月更

NumPy 与 Python 内置列表计算标准差的区别

宇宙之一粟

Numpy 7月月更

需求量最大的6个区块链工作

CECBC

TSDB与Blockchain

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

初识Linkerd项目

阿泽🧸

Linkerd 7月月更

解读《深入理解计算机系统(CSAPP)》第5章优化程序性能

小明Java问道之路

优化逻辑 优化 优化技巧 程序优化 7月月更

App Store 的 App 迁移

贾献华

7月月更

禅道与PingCode 大对比

PingCode

PingCode 项目管理软件 禅道

传统企业要为 Web3 和去中心化做的 11 个准备

CECBC

【刷题记录】4. 寻找两个正序数组的中位数

WangNing

7月月更

C++算法题中对于字符串的一些妙手

KEY.L

7月月更

鸿蒙 eTS 开发方式 Image 组件详解【续】

坚果

HarmonyOS OpenHarmony 7月月更

自动生成API工具——Swagger3

Java学术趴

7月月更

DelayQueue源码分析-特点与新增

zarmnosaj

7月月更

值得学习的Python GUI 库 - pyQt5快速入门及精美界面设计体验

迷彩

PyQt5 Qt Designer 7月月更

Cgroup devices子系统

总想做点什么

区块链技术带来司法“加速度”

CECBC

【愚公系列】2022年7月 Go教学课程 007-计算机进制和变量命名规范

愚公搬代码

7月月更

融云入选优秀厂商!|《2022中国信创生态市场研究及选型评估报告》(附下载)发布

融云 RongCloud

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