扩展方法如何在C#中工作?

Sho*_*kie 0 c#

我不完全确定如何确定方法是否是扩展方法.我阅读了以下指南:

  1. 该方法必须在静态类中(例如"IntExtensions").

  2. 该方法需要是"公共静态"(例如public static int Half(this int source))

我对扩展方法的问题是:

  1. 我不明白我们是如何知道该方法正在扩展的类.它是this前面的类吗?所以在上面的例子中它将是字符串?
  2. 包含该方法的静态类起什么作用?整个语法似乎很混乱.
  3. 我不能为同一个类下的不同类分组许多不同的扩展方法(这似乎没有意义,因为我只想扩展1个类)例如:

/

public static class IntExtensions 
{
    // method has to be static, first parameter is tagged with the 'this'
    // keyword, the type of the parameter is the type that is extended.
    public static int Half(this int source) 
    {
        return source / 2;
    }

    public static string foo( this string s)
    {
        //some code
    }
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ner 9

  1. 扩展方法扩展的类型直接在this签名中的关键字之后,因为这是您的方法将在其上执行的对象的实例.

  2. 扩展方法必须是静态的,因为没有类的实例可以调用它们(它们是传递实例的).使用静态类可确保所有方法都是静态的.

  3. 是的,你可以.正如你所说,但这并没有多大意义.然后,类的消费者将接触所有类型的所有扩展方法,而不是与单个类型相关的方法(这就是为什么我通常按照它们操作的类型组织我的扩展方法类).


Jon*_*eet 5

我不明白我们是如何知道该方法正在扩展的类.它是this前面的类吗?

是.它始终是该方法的第一个参数.你不能用任何其他参数装饰this.(并且它this存在的事实告诉编译器您正在尝试编写扩展方法.)

包含该方法的静态类起什么作用?整个语法似乎很混乱.

它只是一个"容纳"扩展方法的类.经常使用扩展方法不会使用编写它们的类中的任何其他成员,尽管它们可以.(例如,扩展方法可以使用包含它的静态类中的私有静态字段.)

在许多方面 - 包括这一个 - 扩展方法只是一种常规的静态方法.它必须位于顶级静态非泛型类中,并且第一个参数不能是out或者ref,但是一旦满足这些条件,就方法实现而言,它只是一种常规方法.这是"特殊"至于呼叫者而言,在你如何调用该方法条款.(它可以像任何其他静态方法一样调用,请注意.)

我不能为同一个类下的不同类分组许多不同的扩展方法(这似乎没有意义,因为我只想扩展1个类)

是的你可以.这通常不是一个好主意,但你绝对可以做到这一点.

  • **Jon Skeet事实:**Jon Skeet不需要扩展方法.他可以向任何现有类添加方法,即使他没有源代码. (2认同)