C#8.0可空引用类型在这里

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值