.NET 5 带来的新特性 [MemberNotNull] 与 [MemberNotNullWhen]
MemberNotNullAttribute是 .NET 5 的新增特性,位于System.Diagnostics.CodeAnalysis。该特性用于显式声明,调用此方法后该值不再为 Null。
示例如下,创建一个 csproj,启用 C# 8.0 的空引用类型新特性。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<Nullable>enable</Nullable>
<WarningsAsErrors>$(WarningsAsErrors);CS8600;CS8602;CS8603;CS8618;CS8625</WarningsAsErrors>
</PropertyGroup>
</Project>
如下图所示,由于编译器无法保证 _mayNullStr.Length 不会引发空引用异常,所以抛出编译错误 CS8602;

此时可以通过添加 MemberNotNull 特性,显式地告诉编译器方法 PromisStrNotNull() 可以保证 _mayNullStr 不为 Null。

此外他还有一个姊妹 MemberNotNullWhenAttribute
/// <summary>
/// 返回 true 时,<see cref="_mayNullStr"/> 不为 null
/// </summary>
/// <returns></returns>
[MemberNotNullWhen(true, nameof(_mayNullStr))]
private bool StrNotNullWhenReturnTrue()
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Friday)
{
_mayNullStr = "明天不用上班啦!";
return true;
}
_mayNullStr = null;
return false;
}
.NET 5 带来的新特性 [MemberNotNull] 与 [MemberNotNullWhen]的更多相关文章
- Git 2.7: 一个新的带来许多新特性和性能提升的主要版本
在2.6版本发布两个月之后,Git 2.7发布.该版本带来了许多新特性以及性能的提升. 本文选取了Git 2.7带来的主要变化: git remote支持get-url子命令,可以显示指定远端的URL ...
- Xcode8 带来的新特性和坑
Xcode8新特性 Interface Builder 随着14年的iPhone6和6P出来之后,iPhone的屏幕尺寸也越来越多,屏幕适配是一个需要解决的问题,以后不一定苹果又出什么尺寸的iPhon ...
- 发布倒计时!JDK11为我们带来哪些新特性?
今年7月底,JDK11已经进入了Rampdown Phase Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中. 这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今 ...
- Java 14 可能带来什么新特性?
JDK/Java 13 在一个月前已经发布,该版本带来了 5 大新特性,笔者观察到其中的 Text Blocks(文本块)特性似乎被讨论最多. 文本块特性与常见的 Python "" ...
- ASP.NET Core1.0 带来的新特性
1.采用新的文件系统,不再通过工程文件(.sln和.csproj)来定义项目文件清单. 解决方案文件还是*.sln,但项目文件变成*.xproj了.在项目文件夹下新增的文件会被自动添加到项目中,不用再 ...
- C++11 带来的新特性 (4)—— 匿名函数(Lambdas)
1 语法 Lambdas并不是新概念,在其它语言中已经烂大街了.直接进入主题,先看语法: [ captures ] ( params ) specifiers exception attr -> ...
- C++11 带来的新特性 (3)—— 关键字noexcept
1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...
- C++11 带来的新特性 (2)—— 统一初始化(Uniform Initialization)
1 统一初始化(Uniform Initialization) 在C++ 11之前,所有对象的初始化方式是不同的,经常让写代码的我们感到困惑.C++ 11努力创造一个统一的初始化方式. 其语法是使用{ ...
- C++11 带来的新特性 (1)
1 语法改进 1.1 模板表达式中的空格 在c++03 及以前 vector<list<int>>; //Error vector<list<int> > ...
随机推荐
- 可变数据类型不能作为python函数的参数
可变数据类型:列表.字典 不可变数据类型:整型.浮点型.字符串.元组 为什么可变数据类型不能作为python函数的参数?请看以下例子: def foo(a=[]): a.append(1) retur ...
- spring boot:使用caffeine+redis做二级缓存(spring boot 2.3.1)
一,为什么要使用二级缓存? 我们通常会使用caffeine做本地缓存(或者叫做进程内缓存), 它的优点是速度快,操作方便,缺点是不方便管理,不方便扩展 而通常会使用redis作为分布式缓存, 它的优点 ...
- centos8安装kafka(单机方式)
一,下载kafka 1,官网地址 http://kafka.apache.org/downloads.html 2,下载 [root@localhost source]# wget http://mi ...
- linux(centos8):用sort对文本内容排序
一,sort的用途 1,作用: sort命令用于将文本文件内容加以排序. 它能够以行为单位来排序 2,sort常与uniq搭配使用,原因: 用uniq命令去重时, 需要相同的每行位置相邻才能生效, 所 ...
- centos8上添加sudoer用户
一,检查服务器是否已安装sudo的rpm包? 1,查询rpm包列表 [root@yjweb ~]# rpm -qa | grep sudo libsss_sudo-2.0.0-43.el8_0.3.x ...
- MySQL 主从复制原理不再难
上篇我们分析过 Binlog 日志的作用以及存储原理,感兴趣的可以翻阅: 一文带你了解 Binlog 日志 Binlog 日志主要作用是数据恢复和主从复制.本身就是二进制格式的日志文件,网络传输无需进 ...
- Fur 是 .NET 5 平台下企业应用开发最佳实践框架。
Fur 是 .NET 5 平台下企业应用开发最佳实践框架. 立即尝鲜 Fur 是基于最新的 .NET 5 RC2 构建,目的是为了尽早体验新功能,对即将到来的 .NET 5 正式版做出最快的响应. 所 ...
- sentinel控制台与应用通信原理
1,应用程序配置中的port选项用于指定在应用端启动的http server的端口,默认8719 sentinel: transport: dashboard: localhost:8080 port ...
- Java nio Client端简单示例
java nio是一种基于Channel.Selector.Buffer的技术,它是一种非阻塞的IO实现方式 以下Client端示例 public class ClientNio { public s ...
- 需要加强NB-IoT网络优化和终端监管
NB-IoT解决方案在行业规模商用应用中得到了持续的验证,承受住考验,现在芯片和网络问题和障碍已经得到解决. 从统计结果来看,目前的绝大多数问题都集中在终端侧,因为行业的定制化需求以及合伙伙伴的能力差 ...