如果我定义一个扩展方法,例如:
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#编译器在编译时添加了检查?请澄清:)
答案 0 :(得分:25)
没有。你应该从不手动抛出NullReferenceException
。它应该只被框架本身抛出。
在这种情况下,你应该为ArgumentNullException
和instance
投掷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)参数传递给静态方法。剩下的就是糖 - 并且没有糖涉及添加额外的空检查: - )
快乐的编码。