写点什么

C#将引入可空的引用类型

  • 2017-04-20
  • 本文字数:1360 字

    阅读完需:约 4 分钟

是的,标题没错。C#其中一份新提案假定,所有的引用类型在默认情况下都是不可空的。在新语法下,你需要显式地标明一个引用变量是可空的,就像对值类型所做的那样。

和值类型一样,T 是指不可空类型,而 T? 是指可空类型。以下情况会产生警告:

  • 取消对可空变量的引用;
  • 一个可空变量或参数被赋值给一个不可空变量;
  • 从 T?[] 转换到 T[];
  • 从 T[] 转换到 T?[];
  • 将一个空字面量赋值给一个不可空变量或参数;
  • 构造函数没有给所有的不可空字段赋值;

对于前两种情况,如果你使用了感叹号运算符(x!)或者编译器能够证明已经执行了 null 检查,那么警告将被忽略。

实现细节

底层编译器将会忽略可空注解,因此,那不是问题。不过,在程序集级,应该有某种标记,可以说明库在编译时启用了可空注解。

由于所有这类可空的东西从技术上讲都是一种破坏性修改,所以当前的计划是允许开发人员选择下面的类别:

  • 可空警告;
  • 不可空警告;
  • 警告来自其他文件中的注解。

提案继续写道:

选择参与的粒度表明,这是一个类似分析器的模型,大段的代码通过编译指令选择参与和退出,用户可以选择安全级别。此外,每个库的选项(“在准备好应对后果之前,忽略 JSON.NET 中的注解”)可以表示为代码中的属性。

根据预期,这种设计要达到以下三个目的:

  • 用户可以像他们希望的那样逐步采用可空属性检查;
  • 库作者可以添加可空属性注解,而不必担心破坏用户的代码;
  • 除此之外,没有“配置噩梦”之感。

对于同一个方法,你不必进行可空和不可空的重载。虽然从技术上讲,CLR 支持这样做,但那不是 CLS 或者通用语言规范的组成部分。这意味着,大多数编译器都会不知道发生了什么。HaloFour 作了如下说明:

modreq不是 CLS。modopt确实支持重载,但需要具体了解所有重要编译器的这个部分,因为至少要将修饰符复制到调用签名里。两者都会破坏与现有方法签名的兼容。对于希望在整个 BCL 快速传播的东西来说,使用modopt会成为巨大的障碍。

泛型

在使用泛型时,以下情况会出现额外的警告:

  • 从 C转换到 C<T?>,除非类型参数是协变量(出);
  • 从 C<T?> 转换到 C,除非类型参数是反变量(入);
  • 使用 C<T?>,然后将类型参数限制为不可为空。

使用“class”,则泛型强制非空。使用“class?”则允许空值。该提案继续写道:

如果一个类型参数没有约束,或者只有可空约束,则情况会稍微复杂一些:这意味着,相应的类型参数既可以为空,也可以不为空。在那种情况下,安全的做法是将类型参数既作为可空参数来处理,又作为不可空参数来处理,任何一个不满足,就发出警告。

数组

数组是一项特殊的挑战,因为在一个不可为空的数组中,不一定可以确保每个槽都有一个值。

对于一个非空引用数组,我们无法通过充分地跟踪来保证数组的所有元素都被初始化。不过,在从数组读取数据或者传递数组之前,如果新创建的数组没有元素被赋值,我们就会发出警告。那应该可以处理常见的情况,而又不带来太多干扰。

开放性设计问题

使用 default(T) 应该发出警告吗?还是说假定它会返回 T?,而不是 T?

可以删除局部变量上的? 而根据使用情况推断其可空性吗?

参数可以使用 T! x 模式自动生成 null 检查吗?

可以调整一下可空值类型,以便让开发人员可以使用 x.method 代替 x.Value.method 吗(这用在当 x 已知非空时,比如已经成功完成了 null 检查)?

更多信息

查看英文原文: C# Futures: Nullable Reference Types

2017-04-20 18:162036
用户头像

发布了 1008 篇内容, 共 407.7 次阅读, 收获喜欢 346 次。

关注

评论

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

三个方面浅析数据对大语言模型的影响

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 大语言模型

foobar2000 for mac多功能音频播放器 v2.6.1免激活版

Rose

mac音乐播放器 foobar2000中文版 foobar2000破解版

【技术探讨】如何选择一款距离远的无线通信模块?

Geek_ab1536

得物从零构建亿级消息推送系统的送达稳定性监控体系技术实践

JackJiang

网络编程 即时通讯 IM

用游戏盾会掉线吗,游戏出现掉线或者卡顿的可能有哪些原因

德迅云安全杨德俊

万字图解 | 深入揭秘IP层工作原理

云舒编程

IP MTU 路由表 子网划分 图解网络

《Hive编程指南》读书笔记

京东科技开发者

大规模集群下,如何快速实现无死角网络连通性的主动巡检

ii2day

云原生 压力测试 Cloud Native kubernetes 运维 自动巡检

租赁舞台LED屏的注意事项及问题排除

Dylan

活动 LED显示屏 led显示屏厂家 效果广告

合合信息启信数据发布园区金融解决方案,助力银行精准服务“十四五”特色产业

合合技术团队

大数据 金融 合合信息 启信慧眼

苹果macos效率神器alfred5新功能介绍 及alfred 5汉化包下载

Rose

mac软件下载 Alfred 5破解版 Alfred 中文 Mac效率办公软件

WorkPlus构建便捷高效的企业移动门户平台

BeeWorks

AI大模型在电商商家端自定义报表分析中的应用与实践

百度开发者中心

人工智能 电商 大模型

荣耀开发者大会 2023 · 一张图读懂极致体验分论坛

荣耀开发者服务平台

万字图解|深入揭秘 (数据链路层、物理层) 工作原理

云舒编程

IP 物理层 路由 图解网络 数据链路层

测试管理 | 入班第二个月后拿到4个知名企业Offer,他是怎么做到的?

测吧(北京)科技有限公司

测试

热更新适配ibatis原理浅析

京东科技开发者

NineData和Klustron完成产品兼容互认证

NineData

数据库 数据管理 NineData Klustron 泽拓昆仑

软件测试/测试开发|学习两个个月后拿到4个知名企业Offer,他是怎么做到的?

霍格沃兹测试开发学社

人工智能大模型多场景应用原理解析

百度开发者中心

人工智能 图像识别 大模型

4个知名企业Offer拿到手软,他是怎么做到的?附面试真题

测试人

软件测试

火山引擎VeDI:新增微信小程序广告A/B实验功能,助力企业降低获客成本

字节跳动数据平台

数据库 大数据 ab测试 企业号 1 月 PK 榜 对比实验

CES 2024的亮点仅仅聚焦AI深度赋能和产业创新吗?| DALL-E 3、Stable Diffusion等20+ 图像生成模型综述

GPU算力

定制+轻量级低代码:满足客户个性需求的最佳实践

天津汇柏科技有限公司

低代码 软件定制开发 软件开发定制

想在 Mac 里装 Windows ?试试 Parallels Desktop虚拟机!

Rose

Windows系统 Mac双系统安装 Parallels Desktop

QSpace Pro 一款简洁高效的多窗格文件管理器,灵活且实用!

Rose

Mac软件 QSpace 多窗格文件管理器

AI大模型低成本快速定制秘诀:RAG和向量数据库

百度开发者中心

人工智能 数据库 大模型

跨境电商如何利用item_get-根据ID取商品详情(shopee.item_get)提升用户体验?

技术冰糖葫芦

API 编排

阿里云 Flink 原理分析与应用:深入探索 MongoDB Schema Inference

Apache Flink

WorkPlus移动应用管理平台,助力企业实现高效移动办公

BeeWorks

C#将引入可空的引用类型_.NET_Jonathan Allen_InfoQ精选文章