これは、C#3.0の新機能である拡張メソッドを宣言するための構文です。
拡張メソッドは、パーツコード、パーツコンパイラの「魔法」であり、Visual Studioのインテリセンスを利用したコンパイラにより、拡張メソッドが問題のオブジェクトのインスタンスメソッドとして実際に使用可能であるように見えます。
例を挙げましょう。
StringクラスにはGobbleGobbleという名前のメソッドがないので、拡張メソッドを作成しましょう。
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
クラス名は私の命名規則にすぎません。そのように名前を付ける必要はありませんが、メソッドと同様に静的である必要があります。
上記のメソッドを宣言した後、VisualStudioで次のように入力できます。
String s = "Turkey Baster!";
s.
ドットの後、インテリセンスを待ち、そこにGobbleGobbleメソッドがあることに気づき、次のようなコードを完成させます。
String s = "Turkey Baster!";
s.GobbleGobble();
重要:拡張メソッドが宣言されているクラスは、インテリセンスがメソッドを表示するために、コンパイラーとインテリセンスプロセッサーが使用できる必要があります。GobbleGobbleを手動で入力し、Ctrl+.ショートカットを使用する場合、ファイルへのディレクティブを正しく使用するのに役立ちません。
メソッドのパラメーターが消えていることに注意してください。コンパイラは、次の重要なビットをサイレントに移動します。
String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
したがって、上記のコードはコンパイラによって次のように変換されます。
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
したがって、呼び出し時には、魔法のようなものは何もありません。静的メソッドの呼び出しにすぎません。
拡張メソッドが複数のパラメーターを宣言している場合、最初のパラメーターのみがthis
修飾子をサポートし、残りは通常どおりメソッド呼び出しの一部として指定する必要があることに注意してください。
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
拡張メソッドが追加された理由の1つは、C#のLinq構文が、再生中のオブジェクトに対して適切な名前の拡張メソッドを検索することです。つまり、適切な拡張を宣言するだけで、Linqサポートを任意のタイプのクラスに「導入」できます。メソッド。もちろん、Linqの完全サポートは大変な作業ですが、それは可能です。
また、拡張メソッド自体は非常に便利なので、よく読んでください。
ここにいくつかのリンクがあります: