Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 提取方法中的空验证_C#_.net Core_C# 8.0_Nullable Reference Types - Fatal编程技术网

C# 提取方法中的空验证

C# 提取方法中的空验证,c#,.net-core,c#-8.0,nullable-reference-types,C#,.net Core,C# 8.0,Nullable Reference Types,我在.csproj <PropertyGroup> <Nullable>enable</Nullable> <RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild> <RunAnalyzersDuringLiveAnalysis>true</RunAnalyzersDuringLiveAnalysis> </PropertyGroup>

我在
.csproj

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

使可能
真的
真的
下面的代码通过提取的方法验证请求,显示此类警告:

类程序
{
公开作废Foo(数据请求)
{
验证(请求);
request.Properties.TryGetValue(“bar”,out-var-bar);
}
私有静态无效验证(数据请求)
{
if(请求==null)
{
抛出新ArgumentNullException(nameof(request));
}
if(request.Properties==null)
{
抛出新ArgumentNullException(nameof(Data.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; }
}
如何提取验证而不显示警告?

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; }
}
类程序
{
公开作废Foo(数据请求)
{
if(请求==null)
{
抛出新ArgumentNullException(nameof(request));
}
if(request.Properties==null)
{
抛出新ArgumentNullException(nameof(Data.Properties));
}
request.Properties.TryGetValue(“bar”,out-var-bar);
}
}
公共类数据
{
公共字典?属性{get;set;}
}
我认为currenty(如果您想在方法
验证中同时验证
请求
请求.属性
)解决此问题的唯一方法是使用
空原谅运算符

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

如果考虑从代码< >验证> /代码>中提取<代码>请求。属性< /代码>,则可以使用属性来修复问题。Attribute

NotNullAttribute
指定调用返回时输入参数不是
null
。使用此属性,我们可以通过下一种方式声明
验证

private static void Validate([System.Diagnostics.CodeAnalysis.NotNull] object? obj, string name)
{
    if (obj == null)
    {
        throw new ArgumentNullException(name);
    }
}
调用此方法后,
Validate
代码分析器知道
obj
不为空,并且它不会为访问
obj
的代码生成警告

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

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

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