.NET 5 帶來的新特性 [MemberNotNull] 與 [MemberNotNullWhen]

Surbowl發表於2020-11-20

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;
}

 

相關文章