是否有必要从扩展方法中抛出NullReferenceException?

时间:2011-01-25 10:19:29

标签: c# extension-methods

如果我定义一个扩展方法,例如:

static public String ToTitleCase(this string instance, CultureInfo culture)
{
    if (instance == null)
        throw new NullReferenceException();

    if (culture == null)
        throw new ArgumentNullException("culture");

    return culture.TextInfo.ToTitleCase(instance);
}

我是否有必要检查字符串实例是否为null并自己抛出空引用异常?或者CLR是否在这种情况下处理扩展方法,例如实例方法,并为我处理检查/抛出?

我知道扩展方法只是静态方法的语法糖,也许C#编译器在编译时添加了检查?请澄清:)

2 个答案:

答案 0 :(得分:25)

没有。你应该从不手动抛出NullReferenceException。它应该只被框架本身抛出。

在这种情况下,你应该为ArgumentNullExceptioninstance投掷culture

static public String ToTitleCase(this string instance, CultureInfo culture)
{
    if (instance == null)
        throw new ArgumentNullException("instance");

    if (culture == null)
        throw new ArgumentNullException("culture");

   return culture.TextInfo.ToTitleCase(instance);
}

来自NullReferenceException documentation

  

请注意,应用程序会抛出   ArgumentNullException例外   而不是   NullReferenceException例外   在这里讨论。

答案 1 :(得分:1)

肯定不是。然而,“快速失败”,有些人忘记了......“失败了”。但是,我认为不抛出ArgumentNullException(辩论与NullReferenceException留给其他帖子)的原因是有限的,通常与过于聪明有关:-)一个假设的用例可能是IsNullOrEmpty只要它实际上有用,并使代码更清晰:去吧。

没有来自CLR的检查。就运行时而言,它只是将一个(可能为null)参数传递给静态方法。剩下的就是糖 - 并且没有糖涉及添加额外的空检查: - )

快乐的编码。