在链接扩展方法的这两种方法中,有没有理由使用其中一种方法?

时间:2012-02-09 20:44:14

标签: c# extension-methods method-chaining

假设我有一个带有以下两个签名的重载扩展方法:

public static void MyExtensionMethod(this Foo foo);
public static void MyExtensionMethod(this Foo foo, Bar bar);

我想将一种方法链接到另一种方法。我可以通过以下两种方式之一来做到这一点:

链接技术#1

public static void MyExtensionMethod(this Foo foo)
{
    // Call overload using extension method syntax.
    foo.MyExtensionMethod(new Bar());
}

public static void MyExtensionMethod(this Foo foo, Bar bar)
{
    // Do stuff...
}

链接技术#2

public static void MyExtensionMethod(this Foo foo)
{
    // Call overload as a regular method.
    MyExtensionMethod(foo, new Bar());
}

public static void MyExtensionMethod(this Foo foo, Bar bar)
{
    // Do stuff...
}

这是我的问题:调用重载方法作为扩展方法与常规方法之间有什么区别吗?如果是这样,有什么区别?一个人比另一个好吗?

4 个答案:

答案 0 :(得分:6)

假设编译器能够解析所有内容,它们应该作为等效的MSIL发出。扩展方法只是编译器技巧;他们实际上是静态方法。

Servy在他的回答中指出,如果你有一个同名的实例方法,你可能会遇到问题。 我同意 ...因此,强烈建议您永远将扩展方法命名为与任何实例方法相同。

答案 1 :(得分:3)

我发现你的技术2更自然地阅读。

第一个有点刺耳 - 我需要弄清楚它会调用第二个扩展方法。

因此,仅就可读性而言,我会选择技术2。

就如何调用事物而言 - 扩展方法只是调用静态方法的语法糖。两个例子都是相同的。


如@Servy的答案所述,有一个例外 - 如果你有一个具有完全相同名称和参数的实例方法(禁止第一个this参数),你可能会遇到问题。虽然不太可能在您自己的代码库中出现,但这可能会发生 - 这只是使用扩展方法的结果。

这样做是不好的做法 - 不要将实例方法命名为扩展方法。

答案 2 :(得分:3)

这个问题等同于问“将扩展方法作为扩展方式与静态方法相比有什么区别?”。答案是不。编译器将两个调用都转换为相同的代码。

答案 3 :(得分:1)

第二个实际上更稳定。如果我做了类似的事情,第一个将被改变:

public class Foo
{
    public void MyExtensionMethod(Bar bar)
    {
        Console.WriteLine("instance method");
    }
}

如果我添加它,那么在第一种情况下它调用实例方法,在第二种情况下它调用扩展方法。