写点什么

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

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

关注

评论

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

Redis 高可用篇:Cluster 集群原理剖析,集群可以无限拓展么

码哥字节

redis cluster NoSQL 数据库 11月日更

为什么要学习HarmonyOS以及如何快速上手?(1)

android 程序员 移动开发

一个简单强大且灵活的 MVP 框架。

android 程序员 移动开发

一种清晰, 便于扩展android项目架构方案

android 程序员 移动开发

一行代码解决安卓重复点击?

android 程序员 移动开发

iOS开发:上架App被拒原因5.1.1Legal Privacy - Data Collection and Storage

三掌柜

11月日更

一位Android大牛的BAT面试心得与经验总结

android 程序员 移动开发

三面字节跳动被虐得“体无完肤”,15天读完这份pdf

android 程序员 移动开发

一次面试被问到ArrayMap,原理及源码分析详解

android 程序员 移动开发

万字长文 - Kotlin 协程进阶

android 程序员 移动开发

一款Android开发者神器,从此不怕Show case

android 程序员 移动开发

为什么要学习HarmonyOS以及如何快速上手?

android 程序员 移动开发

二本吊打985?看到原因,网友们服气了!

android 程序员 移动开发

一个34岁出来面试还被拒绝的Android程序员有多惨?

android 程序员 移动开发

不要花大力气学-Kotlin

android 程序员 移动开发

为什么有着足够出色的技术,中年程序员依然面临中年危机?

android 程序员 移动开发

为啥mybatis的mapper只有接口没有实现类,但它却能工作?(全网独一份!

android 程序员 移动开发

两年Android开发三面上岸腾讯,这些核心知识点建议收藏

android 程序员 移动开发

管理云服务器密码

坚果

云服务器 服务器密码 11月日更

一封给Android开发者 UI 自动化测试上手指南

android 程序员 移动开发

一波Android面试(附答案)

android 程序员 移动开发

一篇文章教你搞清楚——Kotlin-进阶---不变型、协变

程序员 移动开发

一起看 I_O _ Android 12 Beta 版发布,诸多亮点不容错过

android 程序员 移动开发

七月脱产复习上岸Byte Dance,敢问:这不比“博人传

android 程序员 移动开发

三年经验Android开发面经总结

android 程序员 移动开发

不要学得太杂太乱!学习Android开发只要记住这几点!

android 程序员 移动开发

为什么要配置环境变量

android 程序员 移动开发

一个自学Android-人的第三年的面经分享

android 程序员 移动开发

一位30多岁已婚已育没有车贷男程序员的不安

android 程序员 移动开发

一直认为Android不好找工作的同学,你的问题在这里!

android 程序员 移动开发

三年 Android 开发的技术人生,浅谈自身面试的感悟

android 程序员 移动开发

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