写点什么

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

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

关注

评论

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

delphi中TServerSocker使用stThreadBlocking模式的例子

linux大本营

winDbg 提示 Unable to verify checksum for IOCommModel.exe

linux大本营

网络安全 数字证书

在Ubuntu的Vscode中怎么添加第三方库文件sqlite3.h

linux大本营

sqlite Linux ubuntu vscode

C语言sqlit3创建表格怎么写

linux大本营

sqlite 数据库 C语言

AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?

王吉伟频道

RPA AI大模型 ChatGPT RPAxAI 企业级RPA

缓解过拟合方法

linux大本营

leaflet加载聚合

linux大本营

/sbin/kexec参数说明

linux大本营

Linux 镜像 Linux内核

fmt库c++

linux大本营

C++ fmt

Apache derby 和sqlite进行对比

linux大本营

sqlite 数据库

什么叫函数的注册,用c++举个例子

linux大本营

c++ 函数

领先企业的数智化进入2.0阶段,需要升级数智底座

用友BIP

arm m4 xpsr每一位的作用

linux大本营

寄存器 arm

uniapp配置基本的tabbar和动态修改内容

格斗家不爱在外太空沉思

uni-app 三周年连更

linux tee命令

linux大本营

linux命令 TEE

ES开发指南|如何快速上手ElasticSearch

浅羽技术

全文检索 搜索 Lucence Elastic Search 三周年连更

改变this指向的方法

linux大本营

指针 C语言 this指针

怎么查看 .crash文件

linux大本营

Linux gdb Crash 内核 perf

【Linux】iptables之防火墙概述及规则匹配+实例(1)

A-刘晨阳

Linux iptables 防火墙规则 三周年连更

创建和管理复杂的项目:OmniPlan Pro 4 mac中文版

真大的脸盆

Mac Mac 软件 项目管理工具 项目流程软件

想转行计算机但不知道转哪个方面比较好?

linux大本营

软件开发 计算机

linux crash怎么分析

linux大本营

Crash Linux内核

请详述c++中 lambda表达式使用

linux大本营

Lambda vector Function C++

C++grpc 服务器接收到请求后如何处理

linux大本营

gRPC 序列化 protobuf C++

20道mysql数据库笔试题及答案

linux大本营

MySQL 数据库

C++11引入了std::atomic模板类无锁栈的实现如何判断栈空

linux大本营

多线程 线程安全 C++11

火山引擎云原生数据仓库ByteHouse技术白皮书V1.0 (Ⅴ)

字节跳动数据平台

数据仓库 云原生 白皮书 企业号 4 月 PK 榜

@PathVariable 和 @RequestParam 的区别

linux大本营

koal_dm8_crypto.so.1.0.9.x86.b6f523 怎么安装

linux大本营

Linux linux文件

stl中,cbegin,cend,crbegin,crend区别以及用途

linux大本营

容器 stl C++ STL

ubuntu安装kernel-debuginfo

linux大本营

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