文章插图
string? 依然是 string,int? 不再是 int,而是变成了 Nullable 类型,相当于:
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://shimg.jingyanzongjie.com/230728/014433C25-57.png)
文章插图
二、为什么要引入可空引用类型?分析一下这个有意思的 CS8600 警告:
严重性
代码
说明
警告
CS8600
将 null 文本或可能的 null 值转换为不可为 null 类型 。
嘿!我大引用类型什么时候变成不可为 null 类型了?根据微软文档的解释:该警告的目的是将应用程序在运行时引发 System.NullReferenceException 的可能性降至最低 。简单说就是降低代码在运行时引发空引用异常的概率,这一做法会让程序在运行时带来一些效率上的提高 。至于是怎么提高的,应该是避免了异常的频繁发生,导致程序频繁终止 。(个人观点,仅供参考) 。
三、Nullable<T> 的实现[注意:Nullable<T> 和 Nullable 是两个不同的概念,前一个是结构体,后一个是类;当然二者都是数据类型]
(一) 一个构造方法
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL2ltZzIwMjIuY25ibG9ncy5jb20vYmxvZy8yODUxNTQwLzIwMjIxMS8yODUxNTQwLTIwMjIxMTA4MTQwOTA1MzUzLTcwMTEzMjExNi5wbmc=.jpg)
文章插图
- Line 14:特性 [NonVersionable]
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://shimg.jingyanzongjie.com/230728/0144332531-59.png)
文章插图
上述文本摘自 Reference Source .NET Framework 4.8 。直译:这个特性用于表示特定成员的实现或结构布局不能以不兼容的方式在给定的平台进行更改 。这允许跨模块内联方法和数据结构,这些方法和结构的实现在ReadyToRun的本机映像中永远不会改变,对这些成员或类型的任何更改都将破坏对ReadyToRun的更改 。说人话大概就是,不允许在某些平台上乱改被其修饰的对象,以此保证在本机映像和实际使用时的一致性,避免在不同的环境下同一个内容出现不同的形式 。
- Line 18:表示当前对象是否存储了元素 。
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://shimg.jingyanzongjie.com/230728/0144336095-60.jpg)
文章插图
判断是否存储了元素以及返回存储的元素 。
(三) 两个字段
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://shimg.jingyanzongjie.com/230728/0144332528-61.png)
文章插图
hasValue 用于表示当前对象是否存储了某个值;value 表示存储的值 。
(四) 两个重载运算符
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://shimg.jingyanzongjie.com/230728/014433E04-62.png)
文章插图
implicit 用于声明隐式的自定义类型转换运算符,实现2个不同类型的隐式转换 。使用隐式转换操作符之后,在编译时会跳过异常检查,可能会出现某些异常或信息丢失 。
explicit 用于声明必须通过显示转换来调用的自定义的类型转换运算符 。不同于隐式转换,显式转换运算符必须通过转换的方式来调用,如果缺少了显式转换,在编译时会产生错误 。
简单来说,这两个关键字用于声明类型转换的运算符,针对自定义类型间的转换,一种为隐式转换,另一种为显示转换 。
- Line 98:将 value 从类型 T 隐式转换为 T?
- Line 105:将 value 从类型 T? 显示转换为 T
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL2ltZzIwMjIuY25ibG9ncy5jb20vYmxvZy8yODUxNTQwLzIwMjIxMS8yODUxNTQwLTIwMjIxMTA4MTQwOTA1NjEwLTUxMzA0NzIyMC5wbmc=.jpg)
文章插图
其包含的方法和其他类型中的方法大致相同,在此不作解释 。
四、(空)合并运算符 ??单个问号在 C# 中是三元表达式的结构之一,也是定于可空类型的符号 。而两个问号被定义为合并运算符,其工作原理如下:对于表达式 <par> = <par1> ?? <par2> 如果左操作数 par1 的值不为 null,则合并运算符返回该值,即 par1;否则,它会计算右操作数并返回其结果 。如果左操作数的计算结果为不为 null,则 ?? 运算符不会计算其右操作数 。
经验总结扩展阅读
- 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学习笔记——内存模型篇