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

时间:2013-10-16 15:18:44

标签: c#

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

  1. 该方法必须是静态类(例如“IntExtensions”)。

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

  3. 我对扩展方法的问题是:

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

      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 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:5)

  

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

是。它总是 方法的第一个参数。您无法使用this修饰任何其他参数。 (事实上​​,this存在,告诉编译器你正在尝试编写扩展方法。)

  

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

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

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

  

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

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

答案 2 :(得分:0)

  

该方法正在扩展的类。是前面有this的班级吗?所以在上面的示例中,它将是string

  

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

请参阅Extension Methods (C# Programming Guide)

  

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

因此类具有是静态的,因为编译器不会创建该类的实例。

  

我不能为同一类

下的不同类分组许多不同的扩展方法

是的,你可以。

答案 3 :(得分:0)

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

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

3)是的,你可以随意分组。