この質問が単純すぎる場合は、事前にお詫び申し上げます。
以下のリンクにある NthIndexOf メソッドが静的クラスと静的クラス メンバーを必要とするのはなぜですか?
この質問が単純すぎる場合は、事前にお詫び申し上げます。
以下のリンクにある NthIndexOf メソッドが静的クラスと静的クラス メンバーを必要とするのはなぜですか?
これは拡張メソッド (MSDN)this
であるため、最初のパラメーターの前にあるキーワードに注意してください。
これにより、次の構文を使用できます。
var result = "foo bar".NthIndexOf("o", 1);
…NthIndexOf
メソッドをSystem.String
型に追加したかのように。これは、その静的クラスの名前空間が使用可能な場所ならどこでも使用できます (using MyExtensions;
たとえば)。
拡張メソッドは、パブリックでネストされていない静的クラスの静的メソッドとして宣言する必要がありますが、拡張メソッドを使用せずに同じロジックをカプセル化できます。その場合、静的クラスとメソッドを使用する必要はありません。
それはEXTENSION METHOD (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);
static キーワードを必要とする拡張メソッドです。