写点什么

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

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

关注

评论

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

SwiftUI数据流之StateObject& ObservedObject探讨

kingnight_pig

ios swift SwiftUI

区块链架构下的智慧城市发展加速

CECBC

信息安全

作业 - 第四章 业务流程与产品文档 (二)

hao hao

Elasticsearch Query Phase

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

优化JAVA代码总结

跳蚤

并发与并行

ES_her0

28天写作

【LeetCode】单调数列Java题解

Albert

算法 LeetCode 28天写作 2月春节不断更

「架构师训练营 4 期」 第八周 - 001&2

凯迪

架构师训练营 4 期

为何要构建团队契约

Bruce Talk

敏捷 Agile

用例2

z

数字经济发展的时代特色

CECBC

数字经济

MySQL连接超时关闭问题解决

flyer0126

MySQL MySQL优化

“他者”德意志(三):“翻险峰”的德国电动汽车产业

脑极体

架构设计篇之微服务实战笔记(九)

小诚信驿站

架构师 刘晓成 小诚信驿站 28天写作

SwiftUI数据流之State&Binding

kingnight_pig

ios swift SwiftUI

不写代码可以写爬虫程序吗?老师说可以,无编码学爬虫之一。

梦想橡皮擦

Python 28天写作 2月春节不断更

mybatis的通用插入更新方案

altantisor

Java mybatis

dubbo 源码 v2.7 分析:SPI机制

程序员架构进阶

Java spi 七日更 28天写作 2月春节不断更

Java 中 Vector 和 SynchronizedList 的区别

看山

Java 线程安全 vector SynchronizedList

秒杀系统的难点在哪?如何突破?

跳蚤

翻译:《实用的Python编程》03_01_Script

codists

Python

架构师训练营 4 期 第9周

引花眠

架构师训练营 4 期

区块链与数字货币的发展到底有什么意义

CECBC

数字货币

产品经理训练营知识汇总

SilentMacUser

产品经理 产品经理训练营 邱岳

第十三周作业&总结

胡益

APP启动流程图

林亚超

2.2 Go语言从入门到精通:Go语言变量

xcbeyond

变量声明 28天写作 Go 语言

SQL Server 多表数据增量获取和发布 1

happlyfox

学习 28天写作 2月春节不断更

(28DW-S8-Day9) 区块链如何对坏节点容错:拜占庭将军问题

mtfelix

28天写作 拜占庭容错 拜占庭将军

浅谈JVM 垃圾回收原理

跳蚤

数据库规范设计说明书 整理

edd

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