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

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

我正在将我们的应用程序从 .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));
}

由于规则CA2208现在想要更改所有 ArgumentException 行(我们有很多行),这将是一项繁重的工作。

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

我想尽可能多地替换为:

ArgumentNullException.ThrowIfNull(anyParam);
c# upgrade .net-6.0
1个回答
13
投票

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

第一个是将您的第一张支票替换为

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

第二个问题是你的第二个、第三个和第四个检查被破坏了,应该修复(这就是CA2208的意思):

ArgumentNullException
的第一个参数是
paramName
,但是
ArgumentException
的第一个参数是不是
paramName
,是
message

例如你的线路

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

实际上应该是:

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

(或者,可选:)

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

正如评论中所建议的,对于此特定检查,

ArgumentOutOfRangeException
可能是更好的选择。但请注意,与
ArgumentException
的构造函数相反,
ArgumentOutOfRangeException
(如
ArgumentNullException
)采用参数名称 firstthen (可选)消息。也就是说,您可以使用其中之一

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

if (intParam <= 0)
{
    throw new ArgumentOutOfRangeException(nameof(intParam),
        nameof(intParam) + " must be a positive integer.");
}
© www.soinside.com 2019 - 2024. All rights reserved.