拡張メソッドの実装について

VB.NETとC#での拡張メソッドの実装方法について

とあるプロジェクトに参加している際に、以下のようなクラスがありました。

CommonExtentionClass

「やべぇ、ちゃんと拡張メソッド使ってやがる!!(VB.NETで)」
という興奮も束の間

Public Shared Function TimeToInt(ByVal pDate As Date) As Integer

それ、拡張メソッドちがうよ… (´;ω;`)

ということで、おさらいも兼ねて、VB.NETとC#での拡張メソッドの実装方法について書いていきます。

参考資料は以下のMSDNをご参照ください。

Ref. 拡張メソッド (Visual Basic) – MSDN

Ref. 拡張メソッド (C# プログラミング ガイド) – MSDN


拡張メソッドについては、参考資料を読んでいただくと分かりますが、
次のようなことができるようになります。

Ex. 通常の静的メソッドの場合 (VB.NET)

Dim dt As New Date()
Dim ret As Integer = CommonExtentionClass.TimeToInt(dt)

Ex. 通常の静的メソッドの場合 (C#)

date dt = new date();
int ret = CommonExtentionClass.TimeToInt(dt);

Ex. 拡張メソッドの場合 (VB.NET)

Dim dt As New Date()
Dim ret As Integer = dt.TimeToInt()

Ex. 拡張メソッドの場合 (C#)

date dt = new date();
int ret = dt.TimeToInt();

このように、date型にもともと実装されているメソッドのように使用できるようになります。

さて、先ほど例に挙げた静的メソッド(VB.NET: Shared, C#: static)を参考に実装をやってみたいと思います。

Ex. 実装元の静的メソッド (VB.NET)

Public Shared Function TimeToInt(ByVal pDate As Date) As Integer
Dim ret As Integer = pDate.Hour * 100 + pDate.Minute
Return ret
End Function

Ex. 実装元の静的メソッド (C#)

public static int TimeToInt(date pDate) {
int ret = pDate.Hour * 100 + pDate.Min;
return ret;
}

さて、まずはVB.NETで拡張メソッドを実装していきます。

Ex. 拡張メソッドの実装例 (VB.NET)

Import System.Runtime.CompilerServices

Module CommonExtensions

<Extension()>
Public Function TimeToInt(ByVal pDate As Date) As Integer
Dim ret As Integer = pDate.Hour * 100 + pDate.Minute
Retrun ret
End Function

End Module

VB.NETでの拡張メソッドは、Module内でのみ定義することができます。

その後、通常通りSubやFunctionを定義していくのですが、拡張メソッドであることを
認識させるために<Extention()>を付けます。

そうすることで、そのメソッドは拡張メソッドであることを宣言することになります。

第1引数に指定されている型が、拡張する型になります。

第2引数以降にも指定している場合、拡張メソッドの引数として設定されます。

次にC#での拡張メソッドを実装していきます。

Ex. 拡張メソッドの実装例 (C#)

public static class CommonExtentions {

public static int TimeToInt(this date pDate) {
int ret = pDate.Hour * 100 + pDate.Minute;
return ret;
}

}

C#では、静的クラス内に静的メソッドを実装します。

VB.NETと同じく第1引数に指定されている型が、拡張する型になりますが、
このとき、C#では型名の前に this を付けます。

第2引数以降は、VB.NETと同じです。

使用する場合には、使用するクラスのusingで静的クラスが含まれる状態にする必要があります。

このように、拡張メソッドは、通常の型に実装されているメソッドのように振る舞うことが可能なため、
コードの最適化や、引数間違いなどを防ぐことができます。

今後も拡張メソッドが広がっていけばいいなと思います。

それでは、今回はここまでです。