我在 .csproj 中使用 c# 8 和可空分析器
<PropertyGroup>
<Nullable>enable</Nullable>
<RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
<RunAnalyzersDuringLiveAnalysis>true</RunAnalyzersDuringLiveAnalysis>
</PropertyGroup>
下面的代码通过提取的方法验证请求,显示这样的警告:
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
方法中同时验证 request
和 request.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/