写点什么

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

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

关注

评论

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

云计算防火墙对象(组)的实践

Python研究所

云计算 防火墙 对象组

【得物技术】前端工程师要知道的Nginx知识

得物技术

nginx 负载均衡 大前端 得物技术 知识

升级dubbo,小心default.version

捉虫大师

Java dubbo

Apache Oozie基本原理与工作流类型

大数据技术指南

大数据 oozie 4月日更

Golang map 模型

花一个无所

源码分析 模型 Go 语言 简易架构图

javascript

wudaxue

JavaScript

时代之盾,国之重器:华为带给政务数据保护的新可能

脑极体

新基建:“区块链+物联网”,是否生活将会改变?

电微13828808271

物联网 区块链标准

Redis split-brain 脑裂

escray

redis 学习 极客时间 Redis 核心技术与实战 4月日更

聪明人的训练(二)

Changing Lin

4月日更

Golang interface 模型

花一个无所

源码分析 模型 Go 语言 简易架构图

睿象云智能告警平台cloudalert排班可以帮你做什么

睿象云

运维 告警 运维人生 智能告警 告警管理

Kafka 零拷贝模型

花一个无所

kafka 模型 简易架构图

树莓派简介

IT蜗壳-Tango

IT蜗壳教学 4月日更

Java一套拳法刷掉n个遍历树的问题 John 易筋 ARTS 打卡 Week 43

John(易筋)

ARTS活动

人生好走的路那么多,你偏要选这条难走的走

小天同学

自我思考 个人感悟 人生修炼 4月日更

Linux chmod命令

一个大红包

4月日更

大数据计算生态之数据存储

小舰

4月日更

新版犀牛书该不该入手?

清秋

JavaScript ecmascript ES6 技术书籍 4月日更

架构实战营 - 模块1 - 作业

Ming

软件架构

手写函数

wudaxue

JavaScript vue.js

dubbo几个问题整理:优雅停机、线程池配置

程序员架构进阶

dubbo 28天写作 4月日更 优雅停机 线程配置

不想写代码偷懒之配置化

顿晓

大前端 配置化开发 4月日更

C/C++ Linux后端进BAT的学习路线(腾讯官方认证)丨Linux服务器开发

Linux服务器开发

腾讯 后端 Linux服务器开发 BAT

2021字节大厂面经分享:Java面试高分宝典!GitHub已标星86.7K

比伯

Java 编程 架构 面试 计算机

头条二面:你们公司怎么处理MySQL的 Binlog 日志?

Java架构师迁哥

Golang channel 模型

花一个无所

源码分析 模型 Go 语言 简易架构图

关于Object,你所必须知道的!

Chalk

大前端 Object 4月日更

找到适合您的数字化转型策略的3个步骤

龙归科技

数字化转型 企业

Tidb模型

花一个无所

架构 TiDB 简易架构图

Golang Map 模型

花一个无所

模型 源码剖析 Go 语言 简易架构图

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