null目标的扩展方法

时间:2010-10-08 23:48:43

标签: 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");

   ...
}

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

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

3 个答案:

答案 0 :(得分:6)

考虑null可以是方法的参数。还要考虑扩展方法foo.Bar<int>();实际上只是IFooExtensions.Bar<int>(foo);的语法糖,你会看到,是的,参数确实可以为null,所以如果你对参数做了些什么,它肯定会适合测试它为null(或简单地让NullReferenceException抛出,拿你的选择)。

注意:仅仅通过使用null引用对象调用来获取异常,因为请记住该方法实际上并不属于该对象。如果(a)你自己故意抛出一个或者(b)方法体通过尝试使用null实例来实际引起它,你只能得到异常。

答案 1 :(得分:2)

  

(2)是否有合法的模式   利用目标可以的事实   是空的?我问这个结果   想知道为何要拨打分机   null引用的方法不会   生成运行时异常   就像你调用一个实例一样   null引用的方法。

嗯,这是一次使用它。

public static class UtilityExtensions
{
    public static void ThrowIfNull( this object obj, string argName )
    {
        if ( obj == null )
        {
            throw new ArgumentNullException( argName );
        }
    }
}

现在,您可以轻松地在一行上编写空检查(如果您的编码约定强制您对所有if语句使用大括号,则会很有帮助。)

public void Foo(string bar)
{
    bar.ThrowIfNull("bar");
    // ...
}

您是否认为“合法”模式取决于您,但如果更改运行时以使空引用上的扩展方法调用抛出异常,我会非常难过。

答案 2 :(得分:1)

由于扩展方法实际上只是用于调用以对象作为第一个参数的静态方法的语法糖,我不明白为什么不应该允许null这个参数值。