是的,标题没错。C#其中一份新提案假定,所有的引用类型在默认情况下都是不可空的。在新语法下,你需要显式地标明一个引用变量是可空的,就像对值类型所做的那样。
和值类型一样,T是指不可空类型,而T?是指可空类型。以下情况会产生警告:
· 取消对可空变量的引用;
· 一个可空变量或参数被赋值给一个不可空变量;
· 从T?[]转换到T[];
· 从T[]转换到T?[];
· 将一个空字面量赋值给一个不可空变量或参数;
· 构造函数没有给所有的不可空字段赋值;
对于前两种情况,如果你使用了感叹号运算符(x!)或者编译器能够证明已经执行了null检查,那么警告将被忽略。
实现细节
底层编译器将会忽略可空注解,因此,那不是问题。不过,在程序集级,应该有某种标记,可以说明库在编译时启用了可空注解。
由于所有这类可空的东西从技术上讲都是一种破坏性修改,所以当前的计划是允许开发人员选择下面的类别:
· 可空警告;
· 不可空警告;
· 警告来自其他文件中的注解。
提案继续写道:
选择参与的粒度表明,这是一个类似分析器的模型,大段的代码通过编译指令选择参与和退出,用户可以选择安全级别。此外,每个库的选项(“在准备好应对后果之前,忽略JSON.NET中的注解”)可以表示为代码中的属性。
根据预期,这种设计要达到以下三个目的:
· 用户可以像他们希望的那样逐步采用可空属性检查;
· 库作者可以添加可空属性注解,而不必担心破坏用户的代码;
· 除此之外,没有“配置噩梦”之感。
对于同一个方法,你不必进行可空和不可空的重载。虽然从技术上讲,CLR支持这样做,但那不是CLS或者通用语言规范的组成部分。这意味着,大多数编译器都会不知道发生了什么。HaloFour作了如下说明:
modreq 不是CLS。 modopt 确实支持重载,但需要具体了解所有重要编译器的这个部分,因为至少要将修饰符复制到调用签名里。两者都会破坏与现有方法签名的兼容。对于希望在整个BCL快速传播的东西来说,使用 modopt 会成为巨大的障碍。
泛型
在使用泛型时,以下情况会出现额外的警告:
· 从C
· 从C
· 使用C
使用“class”,则泛型强制非空。使用“class?”则允许空值。该提案继续写道:
如果一个类型参数没有约束,或者只有可空约束,则情况会稍微复杂一些:这意味着,相应的类型参数既可以为空,也可以不为空。在那种情况下,安全的做法是将类型参数既作为可空参数来处理,又作为不可空参数来处理,任何一个不满足,就发出警告。
数组
数组是一项特殊的挑战,因为在一个不可为空的数组中,不一定可以确保每个槽都有一个值。
对于一个非空引用数组,我们无法通过充分地跟踪来保证数组的所有元素都被初始化。不过,在从数组读取数据或者传递数组之前,如果新创建的数组没有元素被赋值,我们就会发出警告。那应该可以处理常见的情况,而又不带来太多干扰。
开放性设计问题
使用default(T)应该发出警告吗?还是说假定它会返回T?,而不是T?
可以删除局部变量上的?而根据使用情况推断其可空性吗?
参数可以使用T! x模式自动生成null检查吗?
可以调整一下可空值类型,以便让开发人员可以使用x.method代替x.Value.method吗(这用在当x已知非空时,比如已经成功完成了null检查)?
C#将引入可空的引用类型
发表于:2017-08-08
作者:谢丽
来源:
 相关文章
从MVC到DDD:探寻软件架构的本质变迁 CRM软件的种类、特点以及在行业中应用 深度调研Copilot,AI编程助手引领未来... 为React开发人员释放ChatGPT的开发力量 ChatGPT无法胜任的五种编程任务 软件开发人员指南:在自己的数据上训...- 周排行
- 月排行
- 评论排行
-   让你编码嗨到停不下来的8个VSCode插件
-   2024年最具潜力的十大编程语言:引领...
-   前端如何选择图片的格式?你学会了吗
-   设计更快的网页(二):图片替换
-   高效IT:如何利用零代码开发平台快速...
-   2023 年 Java 发展趋势
-   智能可穿戴设备的主要测试步骤
-   高效IT:如何利用零代码开发平台快速...
-   一体化好好的,为什么要前后端分离?
-   让你编码嗨到停不下来的8个VSCode插件
-   五个IntelliJ IDEA插件,高效编写代码
-   前端如何选择图片的格式?你学会了吗
-   Spring Boot是Java程序员的必备技能...
-   Java和Python对比,看完这篇你就知道...
-   从软件出发,非功能测试思考总结
-   展望2017,谁是网络技术头牌?
-   C/C++单元测试工具Visual Unit 4 介绍
-   国内外最好用的6款Bug跟踪管理系统
-   性能测试指标评估必读
-   百度软件测试方案模板
-   38张史上最全的IT工程师技能图谱
-   C/C++单元测试工具Visual Unit 4 介绍
-   2019年,你会选哪些安全测试工具?
-   十款Web服务器性能压力测试工具
-   软件测试入门指南:周期、模型和文档化
-   记自动化测试成神学习之路
-   软件测试全景图 -最全的思维导图