.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>( 十 )


(二) 其余可空特性特性一般主要用于处理警告方面的问题,使得程序更加规范化,在此不作过多演示,更多内容,请参考下表(来自: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>

文章插图
  • Line 13、22:该特性有两种表示方式,就是经常看到的:在括号里写上数字或一个数组

.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>

文章插图

.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>

文章插图
  • Line 28:最后均存储到名为 NullableFlags的 byte 数组中,据名称可以推测,每个不同的数字赋予了 Nullable 这个特性不同的额外功能 。
根据 C# 的编译器roslyn的GitHub页面(roslyn/nullable-metadata.md at main · dotnet/roslyn · GitHub):Each type reference in metadata may have an associated NullableAttribute with a byte[] where each byte represents nullability: 0 for oblivious, 1 for not annotated, and 2 for annotated. 也就是说,该数组中的有效值仅为0、1、2,且具有不同的含义 。【由于无法找到相关文档,也无法进行相关实验操作,数值所代表的含义在此暂不做分析,后续可能会补上】
总结
  1. 可空引用类型是在编译时起作用,在运行时和普通的引用类型没有任何区别,它主要是在编译时结合可空上下文,帮助我们分析代码中可能出现空指针引用异常的地方,这是一个非常好的语法糖,我们只需要遵守上面三种规则,就可以很大程度减少空指针异常的几率,其实,如果仔细看的话,.NET 基础库已经遵守了这个规则,比如object 类的 ToString() 方法和 Equals() 方法等 。
  2. 添加这些特性将为编译器提供有关 API 规则的更多信息 。当调用代码在可为 null 的上下文中编译时,编译器将在调用方违反这些规则时发出警告 。这些特性不会启用对实现进行更多检查 。
  3. 添加可为 null 的引用类型提供了一个初始词汇表,用于描述 API 对可能为 null 的变量的期望 。这些特性提供了更丰富的词汇来将变量的 null 状态描述为前置条件和后置条件 。这些特性更清楚地描述了期望,并为使用 API 的开发人员提供了更好的体验 。在为可为 null 的上下文中更新库时,添加这些特性可指导用户正确使用 API 。这些特性有助

    经验总结扩展阅读