C# の拡張メソッド
C# の拡張メソッドとは?
拡張メソッド (Extension method) を使うと既存のクラス (型) に対してメソッドを追加することが可能になります。
このとき派生クラスを作ったり、再コンパイルしたり、あるいは元となるクラスを変更するなどといったことする必要はありません。
例えば、システムのビルトインの型である string クラスに対しても、 独自のメソッドを追加して拡張することができます。
C# の拡張メソッドの実装方法
C# の拡張メソッドはスタティッククラスのスタティックメソッドとして実装します。そしてスタティックメソッドの第一引数に、this キーワードと共に拡張したいクラスのインスタンスを受け取ります。
次の例では string クラスに、 文字列の内容が整数値かどうか判定する IsInteger() というメソッドを拡張メソッドで追加します。
static class MyExtensions
{
public static bool IsInteger(this string s)
{
return int.TryParse(s, out _);
}
}
out 変数の結果が不要な場合はアンダースコア _ とします。
この拡張メソッドを利用する例は次のようになります。
using static System.Console;
class Program
{
static void Main(string[] args)
{
var s = "";
s = "ABC";
WriteLine($"1: {s}: {s.IsInteger()}");
// 1: ABC: False
s = "123";
WriteLine($"2: {s}: {s.IsInteger()}");
// 2: 123: True
s = null;
WriteLine($"3: {s}: {s.IsInteger()}");
// 3: : False
}
}
null に対して拡張メソッドを呼び出す
上の実行例でみたように s = null とした後に、 s.IsInteger() という呼び出しが成功しています。通常は null 参照例外が発生するところですが、なぜ例外が発生しないのでしょうか。
これは拡張メソッドは実は、スタティックメソッドの呼び出しに置き換えられているからです。
上で見た拡張メソッドの呼び出し部分は次のようなものです。
s.IsInteger()
これは実は次のコードと同じです。
MyExtensions.IsInteger(s)
このため s が null でも null 参照例外が発生することはありません。