前言

在查看《隐式using指令》功能时,我们在csproj中发现这样一个属性:

那么,Nullable到底是干嘛的?

可为空上下文

严格来说,这不是新特性,而是C# 8.0引入的特性之一。该特性用于指示引用类型是否接受null值:

只是在.NET 6以前,该特性默认是禁用的,你可以在VS2019中手工启用:

当启用该特性时,对于不接受null值的引用类型有可能收到null时,将出现警告消息。

Demo

假设有下列方法,接受一个字符串类型(引用类型)的参数:

static void test(string str)
{...
}

如果在运行时对其传入null值,则会引发System.NullReferenceException异常:

而现在,在代码编辑器中,你将看到黄色波浪线,告诉你使用了不允许的空引用类型:

如果变量可以允许有一null值,那么只需添加一个"?":

static void test(string? str)
{Console.WriteLine(str?.Length);
}

此外,你还可使用指令在源代码的任何位置设置,明确当前文件是否使用可为空上下文:

  • #nullable enable:将可为空注释上下文和可为空警告上下文设置为“已启用”。

  • #nullable disable:将可为空注释上下文和可为空警告上下文设置为“已禁用”。

  • #nullable restore:将可为空注释上下文和可为空警告上下文还原到项目设置。

  • #nullable disable warnings:将可为空警告上下文设置为“已禁用”。

  • #nullable enable warnings:将可为空警告上下文设置为“已启用”。

  • #nullable restore warnings:将可为空警告上下文还原到项目设置。

  • #nullable disable annotations:将可为空注释上下文设置为“禁用”。

  • #nullable enable annotations:将可为空注释上下文设置为“启用”。

  • #nullable restore annotations:将注释警告上下文还原到项目设置。

结论

默认开启Nullable,好处就是在开发的时候,会不断的验证引用类型实例是否可为null,避免了引发NullReferenceException异常的很多错误。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

.NET 6新特性试用 | 可空引用类型相关推荐

  1. .NET 6新特性试用 | 总结:我最喜欢的5个特性

    前言 不知不觉,<.NET 6新特性试用>系列文章已经写了20多篇,而今天终于要告一段落了. 如果你还没有看过,详细文章列表在这里: .NET 6新特性试用系列 在这么多特性中,我最喜欢如 ...

  2. .NET 6新特性试用 | ArgumentNullException卫语句

    前言 在前面的文章中(<可空引用类型>),我们介绍过编译器会帮我们检查空引用,但是仅仅是警告.最好的方式还是在运行时用卫语句进行检查: private void Test(WeatherF ...

  3. 5.0 新特性试用体验之 Clustered Index

    作者:hzc989 原文来源: https://tidb.net/blog/69dd056c [是否原创]是 [首发渠道]TiDB 社区 [目录] 一.引言 二.基础前情回顾 三.era withou ...

  4. JDK1.8新特性 Optional判空详解,简化判空操作

    一.简介 从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java ...

  5. .NET 6新特性试用 | LINQ功能改进

    前言 .NET6为LINQ添加了多个新API,在本文中,我们将始终使用User类逐一演示这些添加到LINQ中的内容: public class User {public string Name { g ...

  6. .NET 6新特性试用 | PeriodicTimer

    前言 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windo ...

  7. .NET 6新特性试用 | 可写JSON DOM API

    前言 我们常用JSON的方式,是将类对象序列化/反序列化: var user = new User { Name = "My IO" }; var json = JsonSeria ...

  8. .NET 6新特性试用 | SDK工作负载

    前言 为了应对.NET SDK能够支持的程序集项目(例如iOS.Android.WASM)的不断增长,从.NET 6开始,允许用户仅安装必要的SDK(例如ASP.NET Core),而不是一次性安装& ...

  9. .NET 6新特性试用 | 文件范围的命名空间

    前言 在前面的<隐式using指令>文章中,我们介绍了global using,可以减少我们代码文件中的"噪音",使代码更简洁. 今天,我们介绍.NET 6中另一个简化 ...

最新文章

  1. pytorch JIT浅解析
  2. 《我想进大厂》之JVM夺命连环10问
  3. oem客户工程流程图_OEM产品流程图
  4. 仅通过崩溃地址找出源代码的出错行
  5. C++中this指针的使用方法.
  6. 计算机应用基础专科,2019年自考《计算机应用基础》专科模拟试题及答案
  7. edittext 属性
  8. 安全登录代码 php,PHP登录怎么写安全
  9. 2018农行--软开
  10. 牛客刷题<17>用3-8译码器实现全减器
  11. linux串口编程(termios结构体说明)
  12. C语言实验—— 数值统计
  13. 0x0000011b共享打印机无法连接解决方法
  14. 探秘Google新搜索引擎算法
  15. realsense相机色彩图与深度图对齐
  16. Unity让物体跟随鼠标移动
  17. 09-01 面向对象编程
  18. 特斯拉员工年薪曝光:软件工程师 109 万元
  19. HUAWEI篇 NGFW与AR网关建立GRE over IPSec隧道
  20. Java 生成随机长度字母组合

热门文章

  1. javascript中Date对象的初始化方法
  2. 邮件服务器在企业网中的应用
  3. linux系统远程教程,Linux下实现远程协助
  4. request获取mac地址_【Go】获取用户真实的ip地址
  5. Mysql InnoDB Plugin安装 install
  6. 洛谷P2463 Sandy的卡片【后缀数组】【二分】
  7. 一些部署django用到的linux命令
  8. Yii Listview
  9. Information Retrieval 倒排索引 学习笔记
  10. jQuery遍历not的用法