---
title: "拡張メソッドの実装について | C#もぐもぐ"
description: "VB.NETとC#での拡張メソッドの実装方法について"
url: "https://blog.223n.tech/posts/25/"
---

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

2016年5月8日

[C#](https://blog.223n.tech/tags/C%23/) [VB.NET](https://blog.223n.tech/tags/VB.NET/) [Program](https://blog.223n.tech/tags/Program/)

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

`CommonExtentionClass`

「やべぇ、ちゃんと拡張メソッド使ってやがる!!（VB.NETで）」

という興奮も束の間

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

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

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

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

Ref. [拡張メソッド (Visual Basic) - MSDN](https://msdn.microsoft.com/ja-jp/library/bb384936.aspx?f=255\&MSPPError=-2147217396 "拡張メソッド (Visual Basic) - MSDN")

Ref. [拡張メソッド (C# プログラミング ガイド) - MSDN](https://msdn.microsoft.com/ja-jp/library/bb383977.aspx "拡張メソッド (C# プログラミング ガイド) - MSDN")

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

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

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

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

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

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

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

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

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

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

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

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

```vb
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#)

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

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

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

```vb
Import System.Runtime.CompilerServices
Module CommonExtensions
  Public Function TimeToInt(ByVal pDate As Date) As Integer
    Dim ret As Integer = pDate.Hour \* 100 + pDate.Minute
    Return ret
  End Function
End Module
```

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

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

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

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

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

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

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

```csharp
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で静的クラスが含まれる状態にする必要があります。

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

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

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

[記事一覧に戻る](https://blog.223n.tech/posts/)
