0

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

  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
    }
}
4

4 回答 4

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

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

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

于 2013-10-16T15:21:24.513 回答
5

我不明白我们如何知道该方法正在扩展哪个类。是this前面那个类吗?

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

封装方法的静态类起什么作用?整个语法似乎很混乱。

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

在很多方面——包括这个——扩展方法只是一个普通的静态方法。它必须在顶级静态非泛型类中,并且第一个参数不能是outor ref,但是一旦满足这些条件,就方法实现而言,它只是一个普通方法。就调用者而言,就如何调用该方法而言,它是“特殊的” 。(请注意,它也可以像任何其他静态方法一样被调用。)

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

是的你可以。这通常不是一个好主意,但你绝对可以这样做。

于 2013-10-16T15:21:36.413 回答
0

该方法正在扩展哪个类。是this前面那个类吗?所以在上面的例子中它会是string

是的。

封装方法的静态类起什么作用?整个语法似乎很混乱。

请参阅扩展方法(C# 编程指南)

在您的代码中,您使用实例方法语法调用扩展方法。但是,编译器生成的中间语言 (IL) 会将您的代码转换为对静态方法的调用。

所以类必须是静态的,因为编译器不会创建类的实例。

我不能为同一类下的不同类分组许多不同的扩展方法吗

是的你可以。

于 2013-10-16T15:22:18.503 回答
0

1)是的,它是'this'之后的类型

2) 方法必须始终在类中。它不能在非静态类中,或者它是一个成员,并且需要该类类型的对象才能操作。所以唯一的选择是一个静态类,它可以从任何地方调用。

3) 是的,您可以随意对它们进行分组。

于 2013-10-16T15:22:52.470 回答