C# では、 拡張メソッド この概念により、元の型のソース コードを変更せずに、既存のクラスまたは構造に新しいメソッドを追加できます。また、元の型からの特別な権限は一切必要なく、元の型を再コンパイルする必要もありません。 。で紹介されています C#3.0 。
例を挙げてこの概念について説明しましょう。 3 つのメソッドを含むクラスまたは構造体があり、このクラスまたは構造体に 2 つの新しいメソッドを追加したいとします。クラス/構造体のソース コードを持っていないか、クラス/構造体からのアクセス許可を持っていないか、またはクラスはシールされたクラスですが、そのクラスに新しいメソッドを追加したい場合は、概念拡張メソッドを使用して、既存のクラス/構造に新しいメソッドを追加できます。
Javaのjvm
次に、既存のクラスに追加する 2 つのメソッドを含む静的な新しいクラスを作成し、このクラスを既存のクラスにバインドします。バインド後、既存のクラスが新しく追加された 2 つのメソッドにアクセスできることがわかります。以下のプログラムに示すように。

例:
まず、次のような名前のクラスを作成します。 オタク で プログラム1.cs ファイル。これには 3 つのメソッドが含まれています。 M1() 、 M2() 、 そして M3() 。
C#
// C# program to illustrate the concept // of the extension methods using System; namespace ExtensionMethod { // Here Geek class contains three methods // Now we want to add two more new methods in it // Without re-compiling this class class Geek { // Method 1 public void M1() { Console.WriteLine("Method Name: M1"); } // Method 2 public void M2() { Console.WriteLine("Method Name: M2"); } // Method 3 public void M3() { Console.WriteLine("Method Name: M3"); } } }> ここで、NewMethodClass という名前の静的クラスを作成します。 プログラム2.cs ファイル。これには 2 つのメソッドが含まれています。 M4() そして M5() 。ここで、これらのメソッドを追加したいと思います。 オタク クラスなので、 バインディングパラメータ これらのメソッドを Geek クラスにバインドします。その後、Geek クラスが 5 つのメソッドすべてにアクセスする GFG という名前の別のクラスを作成します。>
// C# program to illustrate the concept // of the extension methods using System; namespace ExtensionMethod { // This class contains M4 and M5 method // Which we want to add in Geek class. // NewMethodClass is a static class static class NewMethodClass { // Method 4 public static void M4(this Geek g) { Console.WriteLine("Method Name: M4"); } // Method 5 public static void M5(this Geek g, string str) { Console.WriteLine(str); } } // Now we create a new class in which // Geek class access all the five methods public class GFG { // Main Method public static void Main(string[] args) { Geek g = new Geek(); g.M1(); g.M2(); g.M3(); g.M4(); g.M5("Method Name: M5"); } } }> 出力:
Method Name: M1 Method Name: M2 Method Name: M3 Method Name: M4 Method Name: M5>
重要な点:
- ここ、 バインドパラメータ 新しいメソッドを既存のクラスまたは構造体にバインドするために使用されるパラメータです。拡張メソッドはバインディングのみに使用され、他の用途には使用されないため、拡張メソッドを呼び出すときは値を取りません。拡張メソッドのパラメータ リストでは、バインディング パラメータは常に最初の場所に存在します。バインディング パラメータを最初の場所ではなく 2 番目、3 番目、またはその他の場所に記述すると、コンパイラでエラーが発生します。バインディング パラメーターは、このキーワードに続いて、新しいメソッドを追加するクラスの名前とパラメーター名を使用して作成されます。例えば:
this Geek g>
ここ、 これ キーワードはバインドに使用されます。 オタク はバインドするクラス名です、そして g パラメータ名です。 - 拡張メソッドは常に静的メソッドとして定義されますが、クラスまたは構造体にバインドされると、非静的メソッドに変換されます。
- 拡張メソッドが既存のメソッドと同じ名前およびシグネチャで定義されている場合、コンパイラは拡張メソッドではなく既存のメソッドを出力します。言い換えれば、拡張メソッドはサポートしていません メソッドのオーバーライド 。
- 新しいメソッドを追加することもできます。 シールドクラス 拡張メソッドの概念も使用します。
- フィールドには適用できませんが、 プロパティ 、またはイベント。
- 最上位の静的クラスで定義する必要があります。
- 複数のバインディング パラメーターは許可されません。これは、拡張メソッドに 1 つのバインディング パラメーターのみが含まれることを意味します。ただし、拡張メソッドで 1 つ以上の通常パラメータを定義できます。
利点:
- 拡張メソッドの主な利点は、を使用せずに既存のクラスに新しいメソッドを追加できることです。 継承 。
- 既存のクラスのソース コードを変更せずに、既存のクラスに新しいメソッドを追加できます。
- とも連携できます シールドクラス 。