(二) 其余可空特性特性一般主要用于处理警告方面的问题,使得程序更加规范化,在此不作过多演示,更多内容,请参考下表(来自:C# 编译器解释的属性:可为 null 的静态分析 | Microsoft Learn)
Attribute
Category
含义
AllowNull
Precondition
不可为 null 的参数、字段或属性可以为 null 。
DisallowNull
Precondition
可为 null 的参数、字段或属性应永不为 null 。
MaybeNull
后置条件
不可为 null 的参数、字段、属性或返回值可能为 null 。
NotNull
后置条件
可为 null 的参数、字段、属性或返回值将永不为 null 。
MaybeNullWhen
有条件后置条件
当方法返回指定的 bool 值时,不可为 null 的参数可以为 null 。
NotNullWhen
有条件后置条件
当方法返回指定的 bool 值时,可以为 null 的参数不会为 null 。
NotNullIfNotNull
有条件后置条件
如果指定参数的自变量不为 null,则返回值、属性或自变量不为 null 。
MemberNotNull
方法和属性帮助程序方法
当方法返回时,列出的成员不会为 null 。
MemberNotNullWhen
方法和属性帮助程序方法
当方法返回指定的 bool 值时,列出的成员不会为 null 。
DoesNotReturn
无法访问的代码
方法或属性永远不会返回 。换句话说,它总是引发异常 。
DoesNotReturnIf
无法访问的代码
如果关联的 bool 参数具有指定值,则此方法或属性永远不会返回 。
七、特性 [Nullable]特性,在之前的文章中也讲述过,主要是进行修饰,使得对象具有某些额外性质 。
Nullable,属于内部密封类 NullableAttribute,派生自类 Attribute 。
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://shimg.jingyanzongjie.com/230728/0144331242-76.jpg)
文章插图
- Line 13、22:该特性有两种表示方式,就是经常看到的:在括号里写上数字或一个数组
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://shimg.jingyanzongjie.com/230728/014433M02-77.png)
文章插图
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL2ltZzIwMjIuY25ibG9ncy5jb20vYmxvZy8yODUxNTQwLzIwMjIxMS8yODUxNTQwLTIwMjIxMTA4MTQwOTA1MjMyLTE4MTc3NzM5ODUucG5n.jpg)
文章插图
- Line 28:最后均存储到名为 NullableFlags的 byte 数组中,据名称可以推测,每个不同的数字赋予了 Nullable 这个特性不同的额外功能 。
总结
- 可空引用类型是在编译时起作用,在运行时和普通的引用类型没有任何区别,它主要是在编译时结合可空上下文,帮助我们分析代码中可能出现空指针引用异常的地方,这是一个非常好的语法糖,我们只需要遵守上面三种规则,就可以很大程度减少空指针异常的几率,其实,如果仔细看的话,.NET 基础库已经遵守了这个规则,比如object 类的 ToString() 方法和 Equals() 方法等 。
- 添加这些特性将为编译器提供有关 API 规则的更多信息 。当调用代码在可为 null 的上下文中编译时,编译器将在调用方违反这些规则时发出警告 。这些特性不会启用对实现进行更多检查 。
- 添加可为 null 的引用类型提供了一个初始词汇表,用于描述 API 对可能为 null 的变量的期望 。这些特性提供了更丰富的词汇来将变量的 null 状态描述为前置条件和后置条件 。这些特性更清楚地描述了期望,并为使用 API 的开发人员提供了更好的体验 。在为可为 null 的上下文中更新库时,添加这些特性可指导用户正确使用 API 。这些特性有助
经验总结扩展阅读
- MPC:百万富翁问题
- Redisson源码解读-公平锁
- 重新整理 .net core 实践篇 ———— dotnet-dump [外篇]
- PGL Paddle Graph Learning 关于图计算&图学习的基础知识概览:前置知识点学习
- .Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗
- OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
- 关于ASP.NET Core WebSocket实现集群的思考
- .NET周报【11月第1期 2022-11-07】
- JVM学习笔记——内存模型篇