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

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

拡張メソッドとは

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

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

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

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

拡張メソッドの例

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

<Extension>
Public Function IsNullOrEmpty(ByVal str As String) As Boolean
    Return String.IsNullOrEmpty(str)
End Function

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

Dim str As String = "xxx"
str.IsNullOrEmpty           ' False
str = Nothing
str.IsNullOrEmpty           ' True
' "xxx".IsNullOrEmpty       ' リテラルには使えない

拡張メソッドを使えば3行目のようにそのインスタンスのメソッドのように書くことができます。
実態は静的メソッドなので、4行目のようにNnothingに対しても呼び出せます。
C#と違い、リテラルに対しては使用できないようです。

拡張メソッドの作り方

拡張メソッドにできるのは、SubプロシージャとFunctionプロシージャのみで、すべての拡張メソッドは、
System.Runtime.CompilerServices 名前空間の拡張属性 でマークする必要があります。

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

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

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

以下の例ではIEnumerable(Of integer)に対して全要素を3乗するメソッドを定義してみます。

Imports System.Runtime.CompilerServices
Module Module1
    Sub Main()
        Dim list As IEnumerable(Of Integer) = New Integer() {1, 2, 3}
        For Each x As Integer In list.Cube
            Console.WriteLine(x)    ' 1, 8, 27
        Next
        Console.Read()
    End Sub

    <Extension()>
    Public Iterator Function Cube(ByVal list As IEnumerable(Of Integer)) As IEnumerable(Of Integer)
        For Each x As Integer In list
            Yield x * x * x
        Next
    End Function
End Module

参考URL

VB.NETカテゴリの最新記事