c# - ArgumentNullException - 如何简化?

标签 c# exception

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

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/

相关文章:

c# - 如何显式记录方法不会抛出异常

c++ - 异常是如何转移到寻找处理程序的?

javascript - Jasmine expect toThrow 不传也不接

c# - 传递对 C# 数组中元素的引用

c# - SQL View 在管理控制台中速度慢但在应用层中速度快

c# - Xamarin 自定义键盘

c# - 删除导出到文本文件的列之间的空格

c# - 如何在静态类中创建通用静态字典

java - 执行捕获优先级

Java String.format 无法完全格式化日期和整数