0

如果这个问题太简单,我提前道歉。

为什么下面链接中的方法 NthIndexOf 需要静态类和静态类成员?

C# - indexOf第n次出现的字符串?

4

3 回答 3

5

因为它是一种扩展方法(MSDN) ——注意this第一个参数之前的关键字。

这允许您使用以下语法:

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

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

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

于 2012-09-15T04:58:54.937 回答
3

因为它是一种扩展方法(EM)

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

例如:
String 是 .Net 类型。在 EM 之前,如果不进行派生,就无法将自己的方法添加到字符串类型。即使您通过派生这样做,该方法也将被视为派生类型而不是字符串类型的方法。

但是现在有了 EM,您可以在没有衍生的情况下这样做。

EM 的要求(在 C# 中)

  1. 它们必须是公共的和静态的
  2. 定义它们的类也是公共的和静态的。
  3. 最重要的:第一个参数应该是您为其创建 EM 的类型,并且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);
于 2012-09-15T05:01:43.130 回答
0

这是一种需要静态关键字的扩展方法。

于 2012-09-15T05:01:10.443 回答