我注意到这段代码经常出现在我的构造函数中:
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/