写点什么

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

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

关注

评论

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

测试一波回归模型的误差

EquatorCoco

人工智能 数据 回归 挖掘

英特尔亮相MWC 2024,助力企业通过现代化以实现盈利

E科讯

如何做代币分析:以 TRX 币为例

Footprint Analytics

加密货币 Token 代币

SATX合约代币矩阵公排系统开发详情

l8l259l3365

云计算 - 以阿里云为例,企业上云策略全览与最佳实践

快乐非自愿限量之名

云计算 云原生 项目开发

独立站谷歌SEO外包与自建SEO团队:哪个更适合您的业务?

九凌网络

金三银四,聊一聊测试跳槽/面试的必备技能

霍格沃兹测试开发学社

面试官:说一下红锁RedLock的实现原理?

王磊

Java 面试

为多渠道销售集成商品API接口的正式步骤指南

Noah

SD-WAN技术简化企业网络架构的关键优势

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

优雅使用前端枚举Enum,符合国标的那种!

不在线第一只蜗牛

前端 开发 前端框架 Enum

聚道云助力时尚巨头打通数据孤岛,实现全渠道管理升级!

聚道云软件连接器

案例分享

文心一言 VS 讯飞星火 VS chatgpt (203)-- 算法导论15.3 2题

福大大架构师每日一题

福大大架构师每日一题

SD-WAN与MPLS哪一个是最优选择?

Ogcloud

SD-WAN MPLS SD-WAN组网 SD-WAN服务商 SDWAN

解锁财务信任,掌握企业业务合作中的倾听艺术

智达方通

业财融合 全面预算管理 财务管理 经营管理

SD-WAN在银行的应用:降低维护成本、提升网络安全

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

打破购物局限!了解闲鱼商品详情关键词搜索电商API接口,挖掘不一样的购物乐趣!

联讯数据

为什么说第三代指标平台的本质是做 “轻” 数仓?

Aloudata

ETL 指标平台

都说了别用BeanUtils.copyProperties,这不翻车了吧

不在线第一只蜗牛

Java 数据库 后端 Java后端

人工智能引领软件测试新的巨大变革

霍格沃兹测试开发学社

敏捷开发最佳实践:团队维度实践案例——打造敏捷“绿洲”

爱吃小舅的鱼

敏捷 敏捷开发

数据库内核那些事|PolarDB IMCI让你和复杂低效的子查询说拜拜

阿里云瑶池数据库

数据库 云计算 阿里云 SQL子查询 polarDB

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