写点什么

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

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

关注

评论

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

分布式环境下,我想要一致性

架构师修行之路

分布式 分布式系统 架构师 CAP

week 9 学习总结

Geek_2e7dd7

ARTS-WEEK9

一周思进

无接触,云办公!5天完成手机淘宝新版本迭代,揭秘阿里工程师协同研发“神器”

移动研发平台EMAS

LG的“卷轴”柔性屏,技术可期,前景未卜?

脑极体

LeetCode题解:70. 爬楼梯,DP遍历,变量缓存结果,JavaScript,详细注释

Lee Chen

大前端 LeetCode

架构师第九周作业

傻傻的帅

架构师 课程作业

多线程 & 并发架构

石刻掌纹

简述 JVM 垃圾回收原理

一叶知秋

BIGO 实时计算平台建设实践

Apache Flink

flink BIGO

全国首个市场监管区块链电子取证平台正式上线

CECBC

区块链

week 9 作业

Geek_2e7dd7

数据库系统设计概述

码哥字节

数据库 redis mongodb elasticsearch 数据库设计

阿里云移动研发平台 EMAS 助力银行业打造测试中台,提升发版效能

移动研发平台EMAS

iOS身份证号码识别

高丰

厦门航空牵手阿里云打造航空业移动研发中台,研发效率提升50%

移动研发平台EMAS

redis-port支持前缀迁移

心平气和

redis redis-port

阿里云 EMAS HTTPDNS 联合函数计算重磅推出 SDNS 服务,三大能力获得突破

移动研发平台EMAS

阿里云小程序云发布小程序跨平台开发框架,助力开发者一次开发,多端运行

移动研发平台EMAS

100% 展示 MySQL 语句执行的神器-Optimizer Trace

程序员历小冰

MySQL

两万字长文50+张趣图带你领悟网络编程的内功心法

帅旋

网络协议 TCP/IP

相聚“云”课堂,智微智能“双师课堂”促进优质教育资源共享

DT极客

击破技术枷锁与认知迷雾 百度四大杀手锏开启新基建AI风暴

脑极体

Java字符串拼接,去首尾, 判空, 类型转换

狸猫换太子

Java 类型推断 字符串

第九周作业

方堃

设计模式

张明森

手把手教你实现自定义Spring Boot的 Starter

root

Java spring 程序员 Spring Boot starte

原创 | 使用JPA实现DDD持久化-O与R:两个世界

编程道与术

Java hibernate DDD JDBC jpa

学编程没人带?推荐10个免费学编程的最佳网站给你

代码制造者

学习 编程 编译器、程序语言、CPU 编程网站

汇付天下与阿里云合作打造企业级移动中台,运营效率提升100%

移动研发平台EMAS

区块链标准化很重要吗?

CECBC

区块链 区块链规范

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