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

如果我定义一个扩展方法,如下所示:

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并自己抛出空引用exception? 或者CLR在这种情况下是否像实例方法一样处理扩展方法并为我处理检查/抛出?

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

不。您不应该手动抛出NullReferenceException 。 它应该只被框架本身抛出。

在这种情况下,您应该为instanceculture抛出ArgumentNullException

 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文档 :

请注意,应用程序抛出ArgumentNullExceptionexception,而不是此处讨论的NullReferenceExceptionexception。

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

没有来自CLR的支票。 就运行时而言,它只是将一个(可能为null)参数传递给静态方法。 其余的是糖 – 并且没有任何糖涉及添加额外的空检查 🙂

快乐的编码。