如果这个问题太简单,我提前道歉。
为什么下面链接中的方法 NthIndexOf 需要静态类和静态类成员?
因为它是一种扩展方法(MSDN) ——注意this
第一个参数之前的关键字。
这允许您使用以下语法:
var result = "foo bar".NthIndexOf("o", 1);
…就好像您已将NthIndexOf
方法添加到System.String
类型中一样。这将在该静态类的命名空间可用的任何地方可用(using MyExtensions;
例如)。
扩展方法必须声明为公共的、非嵌套静态类的静态方法,但同样的逻辑可以在不使用扩展方法的情况下进行封装,在这种情况下就不需要使用静态类和方法。
因为它是一种扩展方法(EM)。
扩展方法使您能够将方法“添加”到现有类型,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被称为扩展类型的实例方法。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法和在类型中实际定义的方法之间没有明显区别。
例如:
String 是 .Net 类型。在 EM 之前,如果不进行派生,就无法将自己的方法添加到字符串类型。即使您通过派生这样做,该方法也将被视为派生类型而不是字符串类型的方法。
但是现在有了 EM,您可以在没有衍生的情况下这样做。
EM 的要求(在 C# 中)
this
前面应该有关键字。没有它,您的方法将不是 EM,而只是静态方法。在您之前的场景中,您的 EMNthIndexOf
是在静态类中定义的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);
这是一种需要静态关键字的扩展方法。