0

この質問が単純すぎる場合は、事前にお詫び申し上げます。

以下のリンクにある NthIndexOf メソッドが静的クラスと静的クラス メンバーを必要とするのはなぜですか?

C# - 文字列の n 番目の indexOf ?

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

それはEXTENSION METHOD (EM)であるためです。

拡張メソッドを使用すると、新しい派生型を作成したり、再コンパイルしたり、元の型を変更したりすることなく、既存の型にメソッドを「追加」できます。拡張メソッドは特別な種類の静的メソッドですが、拡張された型のインスタンス メソッドであるかのように呼び出されます。C# および Visual Basic で記述されたクライアント コードの場合、拡張メソッドの呼び出しと、型で実際に定義されているメソッドの呼び出しに明確な違いはありません。

例:
String は .Net 型です。EM 以前は、派生せずに独自のメソッドを文字列型に追加することはできませんでした。派生で行ったとしても、そのメソッドは文字列型ではなく派生型のメソッドとしてカウントされます。

しかし、EM を使用すると、そこから派生せずにそれを行うことができます。

EM の要件 (C#)

  1. それらはパブリックで静的でなければなりません
  2. それらが定義されているクラスも public および static です。
  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

static キーワードを必要とする拡張メソッドです。

于 2012-09-15T05:01:10.443 に答える