在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

关注

评论

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

第四周 作业一:系统架构【未陌】

a d e

系统架构

JAVA中的内部类详解

倔强的攻城狮

Java

有状态的服务其实可以做更多的事情

架构师修行之路

分布式 微服务

打破区块链游戏经济的隔阂,或许该从跨游戏资产入手

CECBC

区块链 游戏

IDEA常用设置、快捷键及代码模板

jiangling500

IDEA

实现一个简单的 MobX

局外人

大前端 js React

MySQL-技术专题-mysql的联合索引

码界西柚

头条终面:写个消息中间件

yes

面试 消息队列

反向保理系统设计

森林

学习笔记:架构师训练营-第四周

四夕晖

高并发 系统架构演化

后疫情时期,看区块链如何赋能文创产业加快经济复苏?

CECBC

区块链技术 文创产业

都别拦着我,我要删库了

MySQL从删库到跑路

Linux oracle重装 MySQL 运维 root

Week 2命题作业

balsamspear

极客大学架构师训练营

架构师训练营第 1 期 - 第四周课后练习

Anyou Liu

极客大学架构师训练营

kubernetes是微服务发展的必然产物

架构师修行之路

Kubernetes 分布式 微服务

数字经济2.0—趋势、逻辑、选择

CECBC

区块链 数字经济

Week 2 学习总结

balsamspear

极客大学架构师训练营

为什么学Go(一)

soolaugust

Go 语言

第四周 作业二:系统架构学习总结【未陌】

a d e

系统架构 互联网架构

当我在听播客时,我在听什么?

Nydia

Kubeless 架构设计 | 玩转 Kubeless

donghui

Serverless kubeless

图解超难理解的 Paxos 算法(含伪代码)

多颗糖

分布式 算法 分布式系统 架构师 一致性算法

浅析:线程安全

朱华

Java 多线程与高并发

MySQL-技术专题-事务和并发一致性问题

码界西柚

mybatis plus 自动更新数据库时间的小坑

废材姑娘

Java mybatis

Netty源码解析 -- 服务端启动过程

binecy

Netty nio

深拷贝链表,python处理音频信号和数字信号、vim教程、swift单元测试和UI测试 John 易筋 ARTS 打卡 Week 21

John(易筋)

单元测试 ARTS 打卡计划 python 数字信号 vim教程 深拷贝链表

【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!

冰河

并发编程 高并发 架构设计 秒杀 异步

中国首个“芯片大学”即将落地;生成对抗网络(GAN)的数学原理全解

京东科技开发者

技术 网络 GAN 芯片

读——沟通的艺术,看入人里,看出人外(第三章)

废材姑娘

甲方日常 29

句子

工作 随笔杂谈 日常

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