null目标的扩展方法

Aar*_*ide 3 c# extension-methods

public static IFoo Bar<T>(this IFoo target, ...)
{
   // I'm curious about how useful this check is.
   if (target == null) throw new ArgumentNullException("target");

   ...
}
Run Code Online (Sandbox Code Playgroud)

(1)上面的代码对我来说似乎很奇怪,因为我觉得在任何情况下调用代码都是检查它的人.这个领域的扩展方法是否有些微妙适用?

(2)是否存在利用目标可以为空的事实的合法模式?我想这是因为想知道为什么在空引用上调用扩展方法不会像在null引用上调用实例方法那样生成运行时异常.

Ant*_*ram 6

考虑null可以是方法的参数.还要考虑扩展方法foo.Bar<int>();实际上只是语法糖IFooExtensions.Bar<int>(foo);,你会看到,是的,参数确实可以为null所以如果你正在对参数做一些事情,那么测试它为null(或简单地说)当然是合适的.让我们NullReferenceException抛出,接受你的选择).

注意:仅使用空引用对象调用它不会得到异常,因为请记住该方法实际上不属于该对象.如果(a)您自己故意抛出一个或(b)方法体实际上通过尝试使用null实例来导致它,则只获得异常.