C#の拡張メソッドのサンプルです。
目次
サンプル | 拡張メソッドとは |
拡張メソッドのサンプル | |
stringクラスに拡張メソッドを追加 | |
DateTimeクラスに拡張メソッドを追加 | |
注意 | 拡張元クラスに同じシグネチャのメソッドができた場合 |
拡張メソッドとは
- 既存のクラスに対して継承を使わずにメソッドを追加します。
- 拡張メソッドの作り方は、静的クラスに静的メソッド(static)を作り、1つめの引数にthisと既存クラスのデータ型と変数をつけます。
- 拡張メソッドを呼び出す側は、元のクラスのインスタンスを生成し、そのインスタンスで拡張メソッドを呼び出せます。
拡張メソッドのサンプル
using System;
class Test1
{
static void Main()
{
Class1 c1 = new Class1(); //Class1のインスタンスを生成
Console.WriteLine(c1.Add200(100)); // 300 Class1にないメソッドを実行
}
}
public class Class1
{
public int Add100(int num) // Class1のメソッド
{
return num + 100;
}
}
public static class Class2
{
public static int Add200(this Class1 c1, int num) //Class2のメソッド
{
return num + 200;
}
}
7行目は、クラスのインスタンスを生成し8行目でメソッドを実行しています。
ただし8行目のAdd200メソッドはインスタンスを生成したClass1のメソッドではありません。
→拡張メソッドを使用しています。
18行目は、staticがあるので静的クラスです。
20行目は、staticがるので静的メソッドです。引数の1つめがthis,データ型,変数になっています。
stringクラスに拡張メソッドを追加
using System;
class Test1
{
static void Main()
{
string str = "ABC";
Console.WriteLine(str.AddStr("HELLO")); // ABC-HELLO
}
}
public static class Class2
{
public static string AddStr(this string s1, string str) //拡張メソッド
{
return s1 + "-" + str;
}
}
8行目は、拡張メソッドのAddStrで文字列の末尾に文字列を追加します。
DateTimeクラスに拡張メソッドを追加
using System;
class Test1
{
static void Main()
{
string str = DateTime.Now.AddStr("HELLO");
Console.WriteLine(str); // 2022/05/17 11:29:40-HELLO
}
}
public static class Class2
{
public static string AddStr(this DateTime s1, string str) //拡張メソッド
{
return s1 + "-" + str;
}
}
7行目は、拡張メソッドのAddStrで文字列の末尾に文字列を追加します。
拡張元クラスに同じシグネチャのメソッドができた場合
拡張元クラスに同じシグネチャのメソッドができた場合、拡張元のクラスのメソッドが実行されるので注意が必要です。
using System;
class Test1
{
static void Main()
{
Class1 c1 = new Class1();
Console.WriteLine(c1.Add200(100)); // 0 拡張元メソッドが実行される
}
}
public class Class1
{
public int Add200(int num)//拡張元のメソッドは100引く
{
return num - 100;
}
}
public static class Class2
{
public static int Add200(this Class1 c1, int num) //拡張メソッドは200足す
{
return num + 200;
}
}
関連の記事