写点什么

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

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

关注

评论

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

开发进阶加薪利器:美团架构师最新版的深入理解JVM底层和源码PDF

Java 程序员 后端

开源爆款,阿里P7技术笔记《k8s+docker》

Java 程序员 后端

必知必会JVM二-运行时数据区

Java 程序员 后端

怒肝15天终于将Kafka的重平衡一举拿下

Java 程序员 后端

您必须尝试的10个最流行的Java框架

Java 程序员 后端

开发新人有必要考虑在工作一年后跳槽

Java 程序员 后端

强烈推荐10本程序员必读的书

Java 程序员 后端

总结了才知道,原来Java NIO的channel是这么用的!

Java 程序员 后端

微服务容错组件Hystrix设计分析

Java 程序员 后端

应届生想要找到一份Java开发的工作,需要达到什么水平?

Java 程序员 后端

微服务SpringCloud项目:初步整合rabbitmq

Java 程序员 后端

Android开发:当前项目以Module形式引用别的项目的步骤

三掌柜

11月日更

必知必会JVM三-面试必备,JVM堆内存详解

Java 程序员 后端

悟了!原来这才是分布式事务的正确打开方式

Java 程序员 后端

应云而生,幽灵的威胁 - 云原生应用交付与运维的思考

Java 程序员 后端

微服务架构实战:可扩展分布式数据库集群的搭建

Java 程序员 后端

微服务配置中心 Apollo解析——Portal 创建 Cluster

Java 程序员 后端

微软员工求助:谷歌150w,拼多多200w,腾讯160w,offer怎么选

Java 程序员 后端

开发做了一两年了,感觉遇到了瓶颈,公司已经学不到太多东西,如何成长为技术大牛

Java 程序员 后端

开发十年面试过1000个人,总结出这份高薪Java 面试秘诀

Java 程序员 后端

异步编程的取消机制 竟然还有这样的效果, 要不要了解一下?

Java 程序员 后端

张总:“必须要裁掉那些老家伙”中年程序员真的只能坐等被裁吗?

Java 程序员 后端

微服务配置中心 Apollo 解析——调试环境搭建

Java 程序员 后端

应用服务器集群的Session管理

Java 程序员 后端

当场折服,这份阿里P8大牛给我的JUC知识总结真的超详细

Java 程序员 后端

当程序员多年了,现在竟然还有人只会多线程-,不会异步编程!-我惊呆了

Java 程序员 后端

微服务下的分布式session管理

Java 程序员 后端

微服务治理:CloudConsul和ZooKeeper

Java 程序员 后端

微服务配置中心 Apollo解析——Portal 关联 Namespace

Java 程序员 后端

惊艳!阿里出产的MyCat性能笔记,带你领略什么叫细节爆炸

Java 程序员 后端

惨无人道的性能优化!阿里淘宝双十一性能优化全栈实录我粉了!

Java 程序员 后端

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