2012-09-15 162 views

回答

3

因为这是一个EXTENSION METHOD (EM)

扩展方法使你“增加”的方法,以现有的类型,而无需创建一个新的派生类型,重新编译,或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被称为扩展类型上的实例方法。对于用C#和Visual Basic编写的客户端代码,调用扩展方法和实际在类型中定义的方法之间没有明显区别。

例如:
字符串是.NET类型。在EM之前,如果不派生,则不能将自己的方法添加到字符串类型中。即使你是通过派生来实现的,该方法将被计为派生类型的方法,而不是字符串类型。

但现在与EM的你可以这样做,而不是从它得出。 EM的

要求(C#)

  1. 他们必须是public和static
  2. 它们所定义的类也是公共和静态的。
  3. 最重要:第一个参数应该是您正在为其创建EM的那种类型,并且应该在其前面有this关键字。没有它,你的方法不会是EM,只会是一个静态方法。

在早期scenaro您的EM NthIndexOf您在静态类中定义现在StringExtender

public static class StringExtender 
{ 
    public static int NthIndexOf(this string target, string value, int n) 
    { 
     .... 
    } 
} 

,因为第一个参数包含该字符串的前面,所以你可以把它作为

int result = "My string".NthIndexOf("M", 0); 

如果它不是EM和像这样的普通静态方法

public static class StringExtender 
{ 
    public static int NthIndexOf(string target, string value, int n) 
    { 
     .... 
    } 
} 

话,就只好被称为像

int result = NthIndexOf("My string", "M", 0); 
+0

感谢详细的解答。 – GoBeavs

+0

@OsuBrenden:永远是一种享受。 –

5

因为它是一个extension method (MSDN) - 注意到的第一参数之前关键字this

这可以让你使用语法:

var result = "foo bar".NthIndexOf("o", 1); 

...就像您添加的NthIndexOf方法将System.String类型。这将在该静态类的命名空间可用的任何地方可用(例如,using MyExtensions;)。

扩展方法必须声明为公共的非嵌套静态类的静态方法,但是可以在不使用扩展方法的情况下封装相同的逻辑,在这种情况下,不需要使用静态类&方法。