写点什么

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

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

关注

评论

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

7分钟玩转 AI 应用,函数计算一键部署 AI 生图大模型

阿里巴巴云原生

阿里云 云原生 函数计算

【YashanDB知识库】yasql执行报错

YashanDB

数据库 yashandb

我用RPA生成EXE,并使用激活码对EXE进行管理

火语言RPA

GitLab 国际站中国大陆等地区停服,如何将数据快速迁移到云效

阿里云云效

阿里云 云原生

速来体验!基于有道子曰的翻译大模型2.0正式上线

有道技术团队

人工智能

如何选择工作机会和offer

老张

面试 求职 职业生涯规划

道旅科技借助云消息队列 Kafka 版加速旅游大数据创新发展

阿里巴巴云原生

kafka 阿里云 云原生

【YashanDB知识库】lYAS-02143 invalid username/password, login denied

YashanDB

数据库 yashandb

推荐4款基于.NET开源、功能强大的CMS建站系统

不在线第一只蜗牛

开源

Java定时任务大盘点:发工资也能“指日可待”

京东科技开发者

淘宝天猫API接口深度探索:商品详情与关键词搜索商品列表的高效应用与实战代码

代码忍者

淘宝API接口

【YashanDB知识库】load data一次导入多个文件的数据时报错

YashanDB

数据库 yashandb

【YashanDB知识库】YAS-04115 "SELECT" expected but missing

YashanDB

数据库 yashandb

恭喜 Apache RocketMQ、Apache Seata 荣获 2024 开源创新榜单“年度开源项目”

阿里巴巴云原生

Apache 阿里云 RocketMQ 云原生

Triton-Lang在Transformer优化加速中的实践 | 得物技术

得物技术

人工智能 算法

设计了两个弹性长度数字编码,可以灵活地编解码数字以便高效传输

Drunk

编码 路由协议 DCE

GitLab 国际站中国大陆等地区停服,如何将数据快速迁移到云效

阿里巴巴云原生

阿里云 gitlab 云原生

场景题:如何实现亿级用户在线状态统计?

王磊

通义灵码 2.0 全新升级,阿里云正式推出繁星计划

阿里巴巴云原生

阿里云 云原生

为什么货币政策紧缩但经济持续火爆?

TechubNews

经济形势 货币政策

“数据飞轮” 理念焕新,助力 2025 企业数智化发展

字节跳动数据平台

基于javaPoet的缓存key优化实践

京东科技开发者

京东广告生成式召回基于 NVIDIA TensorRT-LLM 的推理加速实践

京东科技开发者

Vue 路由管理组件-Router

测试人

软件测试

【YashanDB知识库】YCM Monit进程频繁误告警

YashanDB

数据库 yashandb

意图框架习惯推荐方案,为用户提供个性化内容分发

HarmonyOS SDK

harmoyos

探索Vue.js:提升前端开发的利器

测试人

软件测试

完全掌握|豆包MarsCode 编程助手使用技巧

TRAE.ai

人工智能 AI编程 豆包MarsCode

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