写点什么

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

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

关注

评论

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

云效DevOps--效能无极限

六月的雨在InfoQ

云效 Codeup 云效流水线 Flow 9月月更 Thoughts

利用Vim和Github Copilot打造一款强大IDE!

Jackpop

从零开始 - 50行代码实现一个Vuex状态管理器

茶无味的一天

JavaScript Vue vuex

天猫精灵DIY--技能应用

六月的雨在InfoQ

天猫精灵 功能模型 9月月更 公共实体 语音交互

bootstrap input框回车后重新刷新页面问题

六月的雨在InfoQ

bootstrap Input 9月月更 表单提交

Python语法之集合

芯动大师

集合 9月月更 Python语法

The Architecture of Wechat & SMS

David

架构实战营

开源免费!又一款代码文档生成工具!

Jackpop

PLG SaaS 案例:如何实践外链自动增长策略?

程序员泥瓦匠

SaaS

赞美,还是责备?全盘否定孩子的一切是“虐待”!

图灵教育

育儿 教育 脑科学

2021年中国机器学习平台软件及服务市场规模近100亿

易观分析

机器学习

作业

兜里贼缺钱

Javaweb之会话技术

楠羽

技术 笔记 9月月更

8万Star!这个开源项目有点强!

Jackpop

ESP32-C3 应用 篇(实例一、通过MQTT协议连接ONENET上报传感器数据,云平台下发灯光调色)

矜辰所致

mqtt ESP32-C3 9月月更 项目应用 OneNet

看大神如何用Maya再现神剧《绝命毒师》主角/场景

Renderbus瑞云渲染农场

Python语法之函数

芯动大师

极客时间架构训练营模块一作业

李晨

架构

<T>和<?>区别

六月的雨在InfoQ

泛型 Java泛型 9月月更 <T> <?>

赞美,还是责备?全盘否定孩子的一切是“虐待”!

图灵社区

育儿 教育 脑科学

【编程实践】手把手带你利用Python简单实现斐波那契数列

迷彩

斐波那契 9月月更 数列

Spring 注解 @Resource 与 @Autowired 的区别

六月的雨在InfoQ

注解 依赖注入 @Autowired @Resource 9月月更

9 月 Jina AI 中文社区面对面

Jina AI

人工智能 开源 工程师

【云原生 | 从零开始学Kubernetes】十、k8sPod节点亲和性和反亲和性

泡泡

Docker 云计算 云原生 k8s 9月月更

2021年中国知识图谱软件及服务市场规模超100亿,竞争格局不稳定

易观分析

知识图谱

python学习之21天(1)

吉师职业混子

9月月更

Python 入门与基础《刷题篇》(1)

吉师职业混子

9月月更

Python 入门与基础《刷题篇》(2)

吉师职业混子

9月月更

从零开始 - 40行代码实现一个简单Promise函数

茶无味的一天

JavaScript Promise

Python语法之元组

芯动大师

Python 元组 9月月更

跟着卷卷龙一起学Camera--内存池浅析03

卷卷龙

ISP 9月月更

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