C#8使用实用程序方法验证参数

问题描述 投票:1回答:2

说我有一个可以接受可空引用类型的方法,例如

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;
}
c# nullable c#-8.0
2个回答
1
投票

您可以为此使用[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方法的签名

当然,问题是为什么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


0
投票

我经常使用的一种方法听起来像是您要找的东西:

enter image description here

使用了类似的东西:

Microsoft docs
© www.soinside.com 2019 - 2024. All rights reserved.