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