我正在将我们的应用程序从 .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);
您在这里混淆了两个完全不相关的问题:
第一个是将您的第一张支票替换为
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
)采用参数名称 first 和 then (可选)消息。也就是说,您可以使用其中之一
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.");
}