c# - 提取方法中的空验证

标签 c# .net-core c#-8.0 nullable-reference-types

我在 .csproj 中使用 c# 8 和可空分析器

<PropertyGroup>
  <Nullable>enable</Nullable>
  <RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
  <RunAnalyzersDuringLiveAnalysis>true</RunAnalyzersDuringLiveAnalysis>
</PropertyGroup>

下面的代码通过提取的方法验证请求,显示这样的警告:

enter image description here

class Program
{
    public void Foo(Data request)
    {
        Validate(request);

        request.Properties.TryGetValue("bar", out var bar);
    }

    private static void Validate(Data request)
    {
        if (request == null)
        {
            throw new ArgumentNullException(nameof(request));
        }

        if (request.Properties == null)
        {
            throw new ArgumentNullException(nameof(Data.Properties));
        }
    }
}

public class Data
{
    public Dictionary<string, string>? Properties { get; set; }
}

如果我将验证代码直接放入方法中(如下所示),则不会出现警告。

这是为什么?

如何提取验证且不出现警告?

class Program
{
    public void Foo(Data request)
    {
        if (request == null)
        {
            throw new ArgumentNullException(nameof(request));
        }

        if (request.Properties == null)
        {
            throw new ArgumentNullException(nameof(Data.Properties));
        }

        request.Properties.TryGetValue("bar", out var bar);
    }
}

public class Data
{
    public Dictionary<string, string>? Properties { get; set; }
}

最佳答案

我相信当前(如果您想在 Validation 方法中同时验证 requestrequest.Properties)是唯一的方法解决这个问题的方法是使用null宽容运算符:

request.Properties!.TryGetValue("bar", out var bar);

如果您考虑从 Validation 方法中提取 request.Properties 的验证,那么您可以使用属性 NotNullAttribute解决问题。属性 NotNullAttribute 指定调用返回时输入参数不为 null。使用此属性,我们可以通过以下方式声明Validate:

private static void Validate([System.Diagnostics.CodeAnalysis.NotNull] object? obj, string name)
{
    if (obj == null)
    {
        throw new ArgumentNullException(name);
    }
}

调用此方法后Validate代码分析器知道obj不为空,并且不会对访问obj的代码产生警告.

然后我们可以使用Validate而不会收到警告:

public static void Foo(Data request)
{
    Validate(request, nameof(request));
    Validate(request.Properties, nameof(request.Properties));

    request.Properties.TryGetValue("bar", out var bar);
}

关于c# - 提取方法中的空验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62559897/

相关文章:

c# - c# - 如何1个1地读取文件中的字符

c# - 将数据从服务器顺序传输到多个客户端

c# - 使用 .NET Standard 1.4 或 1.5 查询 MySQL DB

c# - Azure Function 中的复杂对象应用设置

c# - 可空引用类型意外 CS8629 可空值类型可能为空且带有临时变量

c# - 如何在不影响 "last write time"的情况下更改文件

C# 记录类型 : Equality comparisons between record sub-classes

c# - 在 .Net Core 中获取文件扩展属性

dependency-injection - 某些服务无法使用库 : NetCore. AutoRegisterDi 构建

c# - 为什么即使在 csproj 中启用 C#8 后也无法在 UWP 中使用 System.Index?