博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#将引入可空的引用类型
阅读量:5773 次
发布时间:2019-06-18

本文共 1642 字,大约阅读时间需要 5 分钟。

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

\\

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

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

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

\\

实现细节

\\

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

\\

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

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

提案继续写道:

\\
\

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

\
\\

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

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

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

\\
\

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

\
\\

泛型

\\

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

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

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

\\
\

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

\
\\

数组

\\

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

\\
\

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

\
\\

开放性设计问题

\\

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

\\

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

\\

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

\\

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

\\

更多信息

\\
  • \\t
  • \

查看英文原文:

转载地址:http://tkoux.baihongyu.com/

你可能感兴趣的文章
《深入理解java虚拟机》学习笔记系列——垃圾收集器&内存分配策略
查看>>
通过XAML Islands使Windows桌面应用程序现代化
查看>>
Javascript 深入浅出原型
查看>>
简单之极,搭建属于自己的Data Mining环境(Spark版本)
查看>>
Ruby 2.5.0概览
查看>>
如何通过解决精益问题提高敏捷团队生产力
查看>>
Apache下.htaccess文件配置及功能介绍
查看>>
Magento XML cheatsheet
查看>>
Egg 2.19.0 发布,阿里开源的企业级 Node.js 框架
查看>>
Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性 ...
查看>>
使用MySQLTuner-perl对MySQL进行优化
查看>>
Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 协程化 ...
查看>>
开发网络视频直播系统需要注意的地方
查看>>
haproxy mysql实例配置
查看>>
强化学习的未来— 第一部分
查看>>
TableStore:用户画像数据的存储和查询利器
查看>>
2019 DockerCon 大会即将召开,快来制定您的专属议程吧!
查看>>
15分钟构建超低成本数据大屏:DataV + DLA
查看>>
MySQL 8.0 压缩包版安装方法
查看>>
@Transient注解输出空间位置属性
查看>>