2008.05.30

拡張メソッドを使ってみる

.NETFramework3.5の新機能である拡張メソッドを使ってみました。
拡張メソッドとは既存のクラスを継承することなく、そのクラスにメソッドを追加できる機能です。

○拡張メソッドの定義

Module StringExtenstions
    ''' <summary>
    ''' 拡張メソッドのテストを行います。
    ''' </summary>
    ''' <param name="vsVal"></param>
    ''' <remarks></remarks>
    <System.Runtime.CompilerServices.Extension()> _
    Public Sub TestExtension(ByVal vsVal As String)
        Console.WriteLine("拡張メソッド'TestExtension'が呼び出されました。")
        Console.WriteLine(vsVal)
    End Sub
End Module

○メソッドの実行

Sub Main()
    Dim sVal As String = "テスト"
    sVal.TestExtension() '拡張メソッドの呼び出し
End Sub

○実行結果

拡張メソッド'TestExtension'が呼び出されました。
テスト

C#だと以下のように定義します。
○拡張メソッドの定義

public static class StringExtensions
{
    /// <summary>
    /// 拡張メソッドのテストを行います。
    /// </summary>
    /// <param name="vsVal"></param>
    public static void TestExtension(this string vsVal)
    {
        Console.WriteLine("拡張メソッド'TestExtension'が呼び出されました。");
        Console.WriteLine(vsVal);
    }
}

上の例だと、Stringクラスに対して拡張メソッドを定義しています。
既存のStringクラスを継承することはできませんが、
あたかもStringクラスにメソッドを追加したかのように使用することが出来ます。
ポイントとして、VBでは拡張メソッドはModule内にしか定義することが出来ません。
また、System.Runtime.CompilerServices.Extension()属性を設定する必要があります。
C#では引数にthisキーワードを付加する必要があります。

さらに、拡張メソッドの呼出しでは参照がNothingの変数に対して呼び出しを行っても、
NullReferenceExceptionが発生しません。

○メソッドの実行

Sub Main()
    Dim sVal As String = Nothing
    sVal.TestExtension() 'NullReferenceExceptionは発生しない
End Sub

○実行結果

拡張メソッド'TestExtension'が呼び出されました。

上記の結果をみると、実際に既存クラスにメソッドが追加されているわけではない事がわかると思います。

この拡張メソッドですが、コードの可読性は向上すると思うので、
使いどころを誤らなければ便利な機能といえるでしょう。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
osano