[C#] 拡張メソッドの使い方

[C#] 拡張メソッドの使い方

拡張メソッドとは

拡張メソッドとは、既存の型(クラス)に対して、の元の型の変更や継承をすることなく、新たなメソッドを追加する仕組みです。
実際には既存の型に対して、静的メソッドを追加し、インスタンスメソッドと同じ構文で呼び出すことができるようになります。

インスタンスメソッドのように書けるので、いちいち引数に渡したりする手間もなく便利です。

C#, VB.NET ともに拡張メソッドを同じように使うことができますが、定義する際の構文が大きく異なります。
このページではC#での定義方法を見ていきます。VBの場合は次のURLを参照してください。

[VB.NET] 拡張メソッドの使い方

拡張メソッドの例

string型には文字の空判定を行う、静的メソッド(IsNullOrEmpty)が定義されていますが、
拡張メソッドを使い、インスタンスメソッドのように使うことができます。

static class Extensions
{
    public static bool IsNullOrEmpty(this string str)
    {
        return string.IsNullOrEmpty(str);
    }
}

上のように、拡張メソッドを定義します。すると、string型のインスタンスメソッドのように書けます。

string xxx = "xxx";
string.IsNullOrEmpty(xxx);  // false
xxx.IsNullOrEmpty();        // false
"".IsNullOrEmpty();         // true

従来であれば2行目のようにいちいち引数に渡して判定する必要がありますが、拡張メソッドを使えば3行目のようにそのインスタンスのメソッドのように書くことができます。
今回の例ではあまり意味はありませんが、4行目のようにリテラル表現に対しても拡張メソッドは利用可能です。

拡張メソッドの作り方

C#の場合、拡張メソッドを作る場合のルールは3つあります。

staticなクラス
staticなメソッドとして定義し、
第一引数の前にthis修飾子を付けます。

拡張メソッドを使用する際の欠点として、定義場所がわかりずらくなるということがあります。
例えば他人の作成したクラスに対して、拡張メソッドで機能を追加したりなどもできるようになりますが、
定義場所が分かりずらくなったりするので、通常はクラスのメソッドとして追加できるものはそうしたほうが良いです。

インターフェースへの拡張メソッドの追加

拡張メソッドはクラスに対してだけでなく、インターフェースに対しても利用可能です。
通常インターフェースは実装は定義できませんが、拡張メソッドを使うことでメソッドの定義のようなことが可能です。

例えば、IEnumerable<int> を2乗する拡張メソッド(Square)を定義してみます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        IEnumerable<int> numbers = new int[] { 1, 2, 3, 4, 5 };
        foreach (var x in numbers.Sqare())
        {
            Console.WriteLine(x);   // 1,4,9,16,25
        }
    }
}
static class Extensions
{
    public static IEnumerable<int> Sqare(this IEnumerable<int> list)
    {
        foreach (var x in list)
        {
            yield return x * x;
        }
    }
}

このようなインターフェースに対する拡張メソッドは、LINQなどで使われる Select や Where などがその典型例です。

参考URL

C#カテゴリの最新記事