C#8.0新特性之可空引用类型

刚接触.net的朋友应该都遇到过Object reference not set to an instance of an object错误,这就是经典空引用错误,为了尽量避免空引用错误,C#8.0带来了可空引用类型。

什么是可空引用类型

我们知道,引用类型本身就可为null,也可以不为null,这里说的可空引用类型,是显示的声明这个变量可为空,如下代码所示。属性Address的类型变为了string?string后加了个?,表示这是可空引用类型。

public string Name{ get;set; }
public string? Address{ get;set; } //这表示可空引用类型

开启可空引用检测

打开项目csproj文件,添加可空引用配置 NullableNullable有两个可选配置项,enabledisableenable表示开启可空引用检查,disable表示关闭。注意,默认创建的项目并不开启可空引用检查。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

声明可空引用类型

先创建一个School类

public class School
{
    public string Name { get; set; } = "清华大学";
    public string Address { get; set; }
}

在开启可空引用检测的情况下,我们发现,Address属性默认为 null,但没声明它是可空引用类型,这里属性下边会多一个绿色的波浪号提示,同时点击运行,编译也会给出警告,如图所示。

这时我们将Address属性改为string?可空引用类型,可以看到波浪号消失,同时编译也不会给出警告,如图所示。

使用可空引用类型

1. 检测是否为空

在使用一个可空引用对象的时候,如果直接使用该对象的方法、属性等,编译器依然会给出绿色波浪号提示,所以使用前,须先判断该对象是否为null,当然这不是必须的,如图所示。

2. 使用 ?.

使用 ?.这种简单方式,如下代码。

public static int GetSchoolAddressLength(School school)
{
    return school.Address?.Length ?? 0;
}

3. 使用 !.

如果你很确信对象一定不为空,那么可以使用 !.,如下代码

public static int GetSchoolAddressLength(School school)
{
    return school.Address!.Length;
}

总结

  1. 引入可空引用类型,如果没有进行可空检测,编译器只是给出警告提示,并不会报错,这虽然不如swift等语言来得彻底,但只要注意编译器给出的提示,也可避免不少麻烦。

  2. 即便引入可空引用类型,这也并不保证100%不再遇到空引用错误。