说我有一个可以接受可空引用类型的方法,例如
int Func(string? param)
{
return param.Length;
}
编译器正确警告param
,应检查null
。
在C#8之前,我曾使用这样的外部实用程序函数来验证参数:
public static class Validate
{
public static void NotNull(object? value, string parameterName, string? field = null)
{
if (value == null) throw new ArgumentNullException(parameterName + (field == null ? string.Empty : "." + field));
}
}
....
int Func(string? param)
{
Validate.NotNull(param, nameof(param));
return param.Length;
}
无论如何,编译器似乎无法检测到参数param
实际上已在null
方法中检查了Validate
并仍然抱怨。
没有其他方法可以直接测试方法中的null
值吗?
int Func(string? param)
{
if (value == null) throw new ArgumentNullException(nameof(param));
return param.Length;
}
您可以为此使用[NotNull]
,因此编译器得知调用[NotNull]
后,该值永远不会为Validate.NotNull
。
null
此后,将不再发出警告:
using System.Diagnostics.CodeAnalysis;
public static class Validate
{
public static void NotNull([NotNull]object? value, string parameterName, string? field = null)
{
if (value == null) throw new ArgumentNullException(parameterName + (field == null ? string.Empty : "." + field));
}
}
当然,问题是为什么Func方法没有签名:
int Func(string? param)
{
Validate.NotNull(param, nameof(param));
return param.Length;
}
如果不可能,也可以使用另一个属性int Func(string param) // no null allowed
,因此
[DisallowNull]
还有更多很棒的属性
[DisallowNull]
检查int Func([DisallowNull] string? param) // gives warning if called with null compile time