.NET 6 用 ArgumentNullException.ThrowIfNull() 替换参数检查;

spa*_*r79 5 c# upgrade .net-6.0

我正在将我们的应用程序从 .NET 3.1 Core 升级到 .NET 6,并尝试使用新的ArgumentNullException.ThrowIfNull();

但在我们的代码中,我们不仅检查 null ,还检查其他内容。

if (anyParam == null)
{
    throw new ArgumentNullException(nameof(anyParam));
}

if (string.IsNullOrEmpty(stringParam))
{
    throw new ArgumentException(nameof(stringParam));
}

if (intParam <= 0)
{
    throw new ArgumentException(nameof(intParam ));
}

if (listParam.Count == 0)
{
    throw new ArgumentException(nameof(listParam));
}
Run Code Online (Sandbox Code Playgroud)

由于规则CA2208现在想要更改所有 ArgumentException 行,因此我们有很多这样的行,这将需要大量工作。

我想知道是否只能安全地替换第一个示例中的纯空检查,或者在不同参数类型的情况下检查什么。找不到正确的文档。

我想尽可能多地替换为:

ArgumentNullException.ThrowIfNull(anyParam);

Hei*_*nzi 12

您在这里混淆了两个完全不相关的问题:

第一个是将您的第一张支票替换为ArgumentNullException.ThrowIfNull. 当然,这是个好主意!从 .NET 7 开始,您还可以将第二个检查替换为ArgumentException.ThrowIfNullOrEmpty.

第二个问题是您的第二个、第三个和第四个检查已损坏,应该修复(这就是CA2208目的): 的第一个参数是ArgumentNullExceptionparamName但 的第一个参数ArgumentException不是,而是。 paramNamemessage

例如,您的线路

if (intParam <= 0)
{
    throw new ArgumentException(nameof(intParam));
}
Run Code Online (Sandbox Code Playgroud)

实际上应该是:

if (intParam <= 0)
{
    throw new ArgumentException(nameof(intParam) + " must be a positive integer.");
}
Run Code Online (Sandbox Code Playgroud)

(或者,可选:)

if (intParam <= 0)
{
    throw new ArgumentException(nameof(intParam) + " must be a positive integer.", 
                                nameof(intParam));
}
Run Code Online (Sandbox Code Playgroud)

正如评论中所建议的,ArgumentOutOfRangeException对于此特定检查可能是更好的选择。但请注意,与ArgumentException的构造函数相反,ArgumentOutOfRangeException(如)首先ArgumentNullException采用参数名称,然后(可选)采用消息。即,您可以使用

if (intParam <= 0)
{
    // yield a generic "out of range" exception message
    throw new ArgumentOutOfRangeException(nameof(intParam));
}
Run Code Online (Sandbox Code Playgroud)

或者

if (intParam <= 0)
{
    throw new ArgumentOutOfRangeException(nameof(intParam),
        nameof(intParam) + " must be a positive integer.");
}
Run Code Online (Sandbox Code Playgroud)

  • @SilentTremor`在上层处理如此多的异常不是负担`在问题或答案中发布的任何代码中都没有异常*处理*。假设我们不在方法保护中抛出异常。然后怎样呢?稍后我们会得到一个“NullReferenceException”?或者更糟糕的是,计算结果不正确而根本不抛出异常? (3认同)