写点什么

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

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

关注

评论

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

成功入选 2023 谷歌出海创业加速器,Tapdata 乘势远航

tapdata

数据采集 数据集成 Tapdata

华为云CodeArts Check代码检查服务用户声音反馈集锦(7)

云计算 软件开发 华为云 代码检查

行于“云”上,“翼”路顺畅!

天翼云开发者社区

云计算 云服务

私有云的优缺点是什么?与公有云的区别

青椒云云电脑

云桌面

BIM对电脑配置要求高 云电脑了解一下

青椒云云电脑

云电脑

GLTF编辑器:在线模型材质编辑工具

3D建模设计

纹理处理 GLTF 材质修改

什么是模型混合模式?

3D建模设计

3D模型 gltf编辑器

FTP加速小技巧 | 这个工具居然能百倍加速FTP?

镭速

ftp ftp传输 ftp加速

软件物料清单管理平台,让开源组件安全问题无所遁形

网安云

异常检测:探索数据深层次背后的奥秘《上篇》

汀丶人工智能

数据挖掘 机器学习 异常检测

如何使用ChatGPT构建一个Web应用程序?

互联网工科生

应用程序 ChatGPT AI编程

五项大奖、三项评估!为行业数字化转型发展注智赋能!

天翼云开发者社区

云计算 云服务

护航政务“云上安全”,天翼云打造自主可控政务云能力体系!

天翼云开发者社区

云计算 网络安全 云服务

软件定义汽车时代,1 亿行代码的安全保障,极狐GitLab 这么做!

极狐GitLab

gitlab 安全 DevSecOps 汽车 安全左移

如何在不同服务器之间来进行安全又极速的大量数据同步?

镭速

GitHub上标星23K+的Redis进阶笔记(应用+原理+集群+拓展+源码)

小小怪下士

Java redis 程序员 java面试

TDengine 用户案例合集 | 智能环保项目的时序数据处理难点与优化实践

TDengine

时序数据库 #TDengine

国泰君安期货新一代国产业务系统上线 首次使用国产分布式数据库TDSQL

极客天地

袋鼠云产品功能更新报告07期|智能、高效、安全,一个都不能少!

袋鼠云数栈

大数据 数据中台 产品更新

百度智能云千帆大模型平台 2.0 产品技术解析

Baidu AICLOUD

异构计算 百度百舸 千帆大模型平台

GLTF编辑器的另一个作用:格式转换

3D建模设计

格式转换 GLTF glb

Java基础面试题 【二】JUC

派大星

Java 面试题

云桌面如何助力校园云办公 老师这么说

青椒云云电脑

云桌面

百度APP iOS端包体积50M优化实践(六)无用方法清理

百度Geek说

ios 百度app 企业号9月PK榜

基于Java开发的数字化询价招标采购系统(SRM系统源码)

金陵老街

spring-boot

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