HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

一代巨星的陨落!

小齐本齐

程序员 程序人生 职场

zabbix 4.x一键部署脚本

edd

成为技术领导者-读书笔记

edd

一次年轻代GC长暂停问题的解决与思考

AI乔治

Java 架构 JVM 优化 GC调优

2020南京国际工业互联网及工业通讯展览会

InfoQ_caf7dbb9aa8a

大作业 二

Jaye

架构师训练营技术知识点

devfan

展览工厂2020南京国际人工智能产品展览会

InfoQ_caf7dbb9aa8a

架构师训练营1期第1周:架构方法 - 作业

piercebn

极客大学架构师训练营

架构知识总结

飞雪

亚洲2020第十三届南京国际智慧新零售暨无人售货展览会

InfoQ_caf7dbb9aa8a

英特尔揭示智能边缘重大机遇,助推产业智能变革

E科讯

架构师训练营第一周学习总结

尹斌

极客大学架构师训练营

架构建模学习总结

林杭戴

极客大学架构师训练营

大作业 一

Jaye

Spring 5 中文解析数据存储篇-事务同步和声明式事物管理

青年IT男

Spring5

甲方日常 17

句子

生活 随笔杂谈

StringBuilder 比 String 快?空嘴白牙的,证据呢!

小傅哥

面试 小傅哥 string StringBuilder StringBuffer

java安全编码指南之:堆污染Heap pollution

程序那些事

Java java安全编码 java安全编码指南 堆污染

【API进阶之路】做OCR文字识别,谁说必须要有AI工程师?

华为云开发者联盟

API 文字识别 OCR

Golang领域模型-依赖倒置

奔奔奔跑

架构 微服务 领域驱动设计 DDD Go 语言

优选2020第十三届南京国际智慧停车展览会

InfoQ_caf7dbb9aa8a

架构师训练营1期 - 第一周 - 食堂就餐卡系统设计

三板斧

极客大学架构师训练营

mysql union子句排序问题

LSJ

开发 SQL语法

架构师训练营大作业

路易斯李李李

架构师培训大作业二——知识思维导图

chanson

快讯2020第十三届南京国际大数据产业博览会

InfoQ_caf7dbb9aa8a

快讯2020第十三届南京国际智慧工地装备展览会

InfoQ_caf7dbb9aa8a

听说你想进腾讯总部?这项黑科技你值得拥有!

腾讯云音视频

音视频

实战中学习浏览器工作原理 — HTML 解析与 CSS 计算

三钻

CSS 大前端 浏览器

What’s New in Dubbo-go-hessian2 v1.7.0

apache/dubbo-go

服务端 dubbo-go Go 语言

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