我使用 c# 8 和可空分析器.csproj
<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; }
}
我相信目前(如果你想同时验证两者request
and request.Properties
在方法中Validation
)解决这个问题的唯一方法是使用null forgiving operator
:
request.Properties!.TryGetValue("bar", out var bar);
如果您考虑提取验证request.Properties
从方法Validation
那么你可以使用属性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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)