如果这个问题太简单,我提前致歉。为什么这里需要静态
为什么在下面的链接中找到的方法NthIndexOf需要静态类和静态类成员?
C# - indexOf the nth occurrence of a string?
如果这个问题太简单,我提前致歉。为什么这里需要静态
为什么在下面的链接中找到的方法NthIndexOf需要静态类和静态类成员?
C# - indexOf the nth occurrence of a string?
因为这是一个EXTENSION METHOD (EM)。
扩展方法使你“增加”的方法,以现有的类型,而无需创建一个新的派生类型,重新编译,或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被称为扩展类型上的实例方法。对于用C#和Visual Basic编写的客户端代码,调用扩展方法和实际在类型中定义的方法之间没有明显区别。
例如:
字符串是.NET类型。在EM之前,如果不派生,则不能将自己的方法添加到字符串类型中。即使你是通过派生来实现的,该方法将被计为派生类型的方法,而不是字符串类型。
但现在与EM的你可以这样做,而不是从它得出。 EM的
要求(C#)
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);
因为它是一个extension method (MSDN) - 注意到的第一参数之前关键字this
。
这可以让你使用语法:
var result = "foo bar".NthIndexOf("o", 1);
...就像您添加的NthIndexOf
方法将System.String
类型。这将在该静态类的命名空间可用的任何地方可用(例如,using MyExtensions;
)。
扩展方法必须声明为公共的非嵌套静态类的静态方法,但是可以在不使用扩展方法的情况下封装相同的逻辑,在这种情况下,不需要使用静态类&方法。
这是一个需要static关键字的extension method。
感谢详细的解答。 – GoBeavs
@OsuBrenden:永远是一种享受。 –