C#8.0刚刚推出了许多新功能。 最重要的一项是对可为空的引用类型(NRT)的支持。 一堆似乎无法解释其作用的词。 我的意思是,不是所有类型(值类型除外)都可以为空吗?
Microsoft用NRT表示的意思是,现在您可以显式告诉编译器检查空值。 他们通过将所有类型的默认值从null切换为not null来实现。 因此,除非明确指定,否则可以假定变量不能再为null。
为什么这样 好吧,这是Microsoft首次尝试解决这个可怕的问题
NullReferenceException困扰了许多应用程序。 许多人甚至将允许在C#中使用空值的决定称为十亿美元的错误 。 您也可以看看我的其他文章( 为什么C#中的null如此糟糕 )以解决这个问题。
试试看
首先,要尝试它,您必须激活它。 创建一个在.net core 3.0
上运行的新应用程序,或者打开.csproj
并添加它。
< LangVersion > 8.0 </ LangVersion >
< Nullable > Enable </ Nullable >
<LangVersion>8.0</LangVersion>
用于启用C#8.0功能,并
<Nullable>Enable</Nullable>
用于将编译器行为从默认为null
的所有类型切换为默认not null
的所有类型。
您还可以按照以下说明为特定的代码块启用/禁用此功能
#nullable enable
#nullable disable
#nullable restore
然后,编译器将在您的代码上运行静态分析,并在检测到特定代码路径中的值可以为null时添加编译警告。
例如
// warning CS8600: Converting null literal or possible null value to non-nullable type
string a = null ;
// warning CS8602: Dereference of a possibly null reference
var l = a.Length;
新运营商
此功能还引入了两个新的运算符来处理这些情况。
- 告诉编译器此对象可以为null。 此运算符的语法与可为空的值类型使用的语法相同。 例如int?
- `!`也称为null宽容运算符,用于告诉编译器我们知道该值不会为null。 编译器将不再检查此变量。 但是请小心,因为如果您输入错误并且在运行时该值为null,则会得到旧的NullReferenceException。 无论如何,这仍然非常有用,因为即使强大的c#编译器在分析代码时也可能出错并出错。 当您使用反射或反序列化等功能时,这些误报往往会发生。请教我如何做
如果我们回到上一个代码块,那么我们现在拥有摆脱这些警告的所有工具。 (请注意,在这种情况下,这些警告是合法的,您应该以其他方式处理它们。这只是演示如何使用这些运算符的示例。)
// this will make sure we can assign a null value to that variable
string ? a = null ;
// this will remove the warning and let us try to call `.Length`
var l = a.Length;
结论
NRT是一个我们都需要学习使用的强大工具。 通过在您的软件开发生命周期(SDLC)的最早阶段发现一些运行时问题,可以使我们更接近正确性 。 这种做法也称为左移。 这个想法是在SDLC中提早提出问题。 开发过程中发现的问题要比生产中发现的问题少。
所有代码示例都可以在github上找到
参考文献
https://docs.microsoft.com/zh-cn/dotnet/csharp/nullable-references
先前发布在https://blog.miguelbernard.com/c-8-0-nullable-reference-types-are-here/
From: https://hackernoon.com/c-80-nullable-reference-types-are-here-36953yux