历史遗留问题

大家都知道在C# 8.0之前,如果我们不对引用类型进行赋值,默认是会赋值为null的。例如:

1

2

3

4

5

6

class Person

{

  public string Name {get;set;} 

}

Person p = new Person();

  以上代码中的p的Name应该为null, 如果想使用它的属性Length我们不得不先判断其是否为null,如果某个地方我们忘记了做null检查就很可能引发异常。

null! 是什么意思

C# 8.0 默认所有引用类型不能默认赋值为null,先看这段代码

1

Console.WriteLine(p.Name.Length)

  这段代码在C# 8.0之前是不会有警告的,当Name未赋值时,这段代码会抛出空引用异常。 而在C# 8.0中,这段代码编译器会给出一个可能为空的警告。

解决这个警告只需要再Name后面加!(null-forgiving operator 暂时称为容错运算符吧)

1

Console.WriteLine(p.Name!.Length)

  这样就会告诉编译器,这个变量我不会赋值为null的,你不用管了!

但是如果Name为null 运行时还是会炮空引用异常。个人猜测微软之所以这么做是为了减少开发人员的空引用出错概率吧!

那么null!又是什么鬼呢? 我们想把null赋值给属性以往会这么做:

1

public string Name { getset; } = null

  这段代码会给出警告,不能将null赋值给不可为空的类型,只要给null加上!就能解决:

1

public string Name { getset; } = null!

  这样看上去有点奇怪, 告诉编译器null不会为null?

我们换个思路来理解,我们可以理解null就是代表空的指针的一个变量名:

1

2

object null;

Name = null!;

  如果当初微软把null设计为none呢。如果还是无法理解,那么就记住,如果想要将引用类型赋值为null,在C# 8.0中就需要在null后面加上!

毕竟语言是人家设计的,有的地方也确实没必要深究。

理解C# 8.0中的null!相关推荐

  1. android toolbar源码解析,深入理解Android 5.0中的Toolbar

    环境说明: Android Studio 2.0 V7包版本:com.android.support:appcompat-v7:23.4.0 compileSdkVersion 23 buildToo ...

  2. Vue3.0中的变化

    1.Vue3 简介 2020 年 9 月 18 日,Vue.js 发布 3.0 版本,代号:One Piece(海贼王) 2.Vue3 带来了什么 1.性能的提升 打包大小减少 41% 初次渲染快 5 ...

  3. mysql count 返回0_如何在MySQL中使用COUNT時返回0而不是null

    我正在使用此查詢返回存儲在$ sTable中的歌曲列表以及存儲在$ sTable2中的總項目的COUNT.如何在MySQL中使用COUNT時返回0而不是null /* * SQL queries * ...

  4. Android RxJava 2.0中backpressure(背压)概念的理解

    英文原文:https://github.com/ReactiveX/RxJava/wiki/Backpressure Backpressure(背压.反压力) 在rxjava中会经常遇到一种情况就是被 ...

  5. MySQL笔记3:深入理解MySQL中的NULL

    深入理解MySQL中的NULL NULL:表示没有值,无法比较两个没有值的量.

  6. mysql null的作用_MySQL中对于NULL值的理解和使用教程

    NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串''的一样的东西.不是这样的!例如,下列语句是完全不同的: ?12mysql>INSERT INTO my ...

  7. java 类 null_深入理解java中的null“类型”

    本文研究的主要是java中的null"类型"的相关实例,具体介绍如下. 先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null"类 ...

  8. 在java中对null的理解

    转载:https://www.cnblogs.com/X-World/p/5686122.html Java中的Null是什么? 1)首先,null是关键字,像public.static.final. ...

  9. 详细了解java中的null_深入理解java中的null“类型”

    本文研究的主要是java中的null"类型"的相关实例,具体介绍如下. 先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null"类 ...

最新文章

  1. RSA加解密算法的Java实现
  2. 使用JavaCV进行手和手指检测
  3. Linux16.04和Windows 10双系统下,解决时间不一致问题
  4. AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
  5. 线性结构 —— 差分数组
  6. STM32F103系列实战之通用同步异步收发器(USART)
  7. a标签隐藏真实地址_推荐软件:Clover(窗口标签化工具)
  8. sql server 并发_并发问题– SQL Server中的理论和实验
  9. mysql 索引 insert_mysql优化:定期删数据 + 批量insert + 字符串加索引为什么很傻
  10. 机器学习项目实战----信用卡欺诈检测(一)
  11. 机器学习基础算法32-隐马尔科夫模型HMM
  12. 模拟tomcat连接器
  13. Chrome最新离线安装包下载
  14. 雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
  15. 做一个略调皮的个人博客--菜单篇
  16. 【数据库考试】考研复试必备数据库试题
  17. 从Facebook更名Meta看元宇宙||亚太元宇宙新纪元峰会正式启动
  18. Infopath2007表单转化成word2007
  19. C++ Opencv 实现Canny算法
  20. 苹果消息推送服务教程:第一二部分(共2部分)

热门文章

  1. JQuery基础-》带有案例-隔行换色-全选-QQ表情-下拉框左右移动
  2. 华为 TD-LTE AT 指令
  3. 最新袋鼠投资学习版源码+带计跑步功能/早起打卡功能
  4. NPDP产品经理认证-可行性分析
  5. 计算机通信与网络大纲中英文,《计算机通信网络》教学大纲(电子信息)
  6. VOIP DTMF 笔记
  7. 流量变现的最佳工具——小程序直播
  8. 并联串联混合的电压和电流_串联谐振赫兹电力讲解高压电缆主绝缘交流耐压试验的电压电流容量|赫兹|电力|电缆...
  9. 东北林业大学计算机考研英语几,东北林业大学(专业学位)计算机技术考研难吗...
  10. som神经网络聚类简单例子_ICML 2020:6篇必读图神经网络(GNN)论文 | 附下载