gpt4 book ai didi

c# - ArgumentNullException - 如何简化?

转载 作者:可可西里 更新时间:2023-11-01 03:04:48 26 4
gpt4 key购买 nike

我注意到这段代码经常出现在我的构造函数中:

if (someParam == null) throw new ArgumentNullException("someParam");
if (someOtherParam == null) throw new ArgumentNullException("someOtherParam");
...

我有一些构造函数,其中注入(inject)了一些东西并且必须全部为非空。任何人都可以想出一种方法来简化这个吗?我唯一能想到的是以下内容:

public static class ExceptionHelpers
{
public static void CheckAndThrowArgNullEx(IEnumerable<KeyValuePair<string, object>> parameters)
{
foreach(var parameter in parameters)
if(parameter.Value == null) throw new ArgumentNullException(parameter.Key);
}
}

但是,它的用法类似于:

ExceptionHelper.CheckAndThrowArgNullEx(new [] {
new KeyValuePair<string, object>("someParam", someParam),
new KeyValuePair<string, object>("someOtherParam", someOtherParam),
... });

... 这并不能真正帮助简化代码。 Tuple.Create() 而不是 KVP 不起作用,因为 Tuple 的 GTP 不是协变的(即使 IEnumerable 的 GTP 是协变的)。有什么想法吗?

最佳答案

C# 7 更新

您可以使用 throw expression与空合并运算符。这是该页面的示例:

public string Name
{
get => name;
set => name = value ??
throw new ArgumentNullException(paramName: nameof(value), message: "New name must not be null");
}

原始答案

就我个人而言,我使用ThrowIfNull 扩展方法。我不知道该归功于谁,但我绝对是didn't invent it .这很好,因为您可以使用返回值进行赋值:

public static T ThrowIfNull<T>(this T argument, string argumentName)
{
if (argument == null)
{
throw new ArgumentNullException(argumentName);
}
return argument;
}

用法:

this.something = theArgument.ThrowIfNull("theArgument");
// or in C# 6
this.something = theArgument.ThrowIfNull(nameof(theArgument));

(虽然有些人认为在空实例上调用扩展方法很奇怪)

如果您确实想一次检查多个参数,那么如果您使用像这样的 params 签名,您的示例可能会更加精简:

public static void CheckAndThrowArgNullEx(params object[] argsAndNames)
{
for (int i = 0; i < argsAndNames.Length; i += 2)
{
if (argsAndNames[i] == null)
{
string argName = (string)argsAndNames[i + 1];
throw new ArgumentNullException(argName);
}
}
}

用法是:

CheckAndThrowArgNullEx(arg1, "arg1", arg2, "arg2");
// or in C# 6
CheckAndThrowArgNullEx(arg1, nameof(arg1), arg2, nameof(arg2));

再三考虑,正如 KeithS 在评论中提到的那样,将其实现为一组重载可能比像这样使用 params object[] 更好:

static void Check(object arg1, string arg1Name) { ... }
static void Check(object arg1, string arg1Name, object arg2, string arg2Name) { ... }
// and so on...

关于c# - ArgumentNullException - 如何简化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12043875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com