c# - .NET 6 将参数检查替换为 ArgumentNullException.ThrowIf

我正在将我们的应用程序从 .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)首先采用参数名称​​然后然后(可选)消息。即,您可以使用任何一种

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.");
}

关于c# - .NET 6 将参数检查替换为 ArgumentNullException.ThrowIfNull();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74190676/

相关文章:

c - 在分配内存之前对灵活成员数组的第一个元素使用 sizeof 是未定义的行为?

r - R中,如果有多个TRUE答案,选择第一个TRUE答案

r - 更快地填充矩阵

haskell - 如何声明一个参数可以是 (Int, Int) 或 Maybe (Int, Int

powershell - 执行功能默认操作,除非给出管道输入?

r - 如何合并两个数据框并提取列的唯一组合?

python - 将扁平化列表转换为字典列表

r - 使用 group_by() 根据条件折叠 R 中的数据集

r - 选定列乘以给定向量

javascript - 左侧条件分配