
拡張メソッドとは?第一引数にthisがある関数の使い方
C#をコーディングしていると、いつの間にか
引数にthisを使ったメソッドを使っていることがあります。
visual studioもthis引数を省略するので、
目にしたことがない人もいるかもしれません。
しかし、定義に飛んでをまじまじと見ていると、引数にthisがあることに気づきます。
引数にthisをとるメソッドたちは一体何なのか?
そこで今回は、thisを第一引数にとる拡張メソッドについて紹介したいと思います。
この記事では
「拡張メソッドは普通のメソッドとおなじように使えるということと」
「普通のメソッドと同じように使えるのに、あえて拡張メソッドを使う場面」
について紹介します。
目次
拡張メソッドは第一引数 thisに指定された対象を機能拡張する
今回は挨拶するメソッドをクラス内に普通に記述するパターンと
拡張メソッドで記述するパターンを並べてみましょう。
普通に記述するパターン
拡張メソッドで記述するパターン
Greet1、Greet2ともに引数youにHelloをくっつけて出力するだけの機能です。
普通のメソッド定義と異なるのは第一引数に自分自身を引数にとること、
public staticで本体とは別のファイルやプロジェクトに記述できるということです。
拡張メソッドは普通のメソッドと同じように使える
それでは実際に使われる場面でみてみましょう。
最初の引数thisは使うときに省略される
冒頭でもいいましたが、visual studioでは使うときに省略されています。
これが、拡張メソッドを作っていなくても、知らず知らずのうちに使っている理由です。
実際にVisual Studioのキャプチャをみてみましょう。

拡張メソッドで記述したGreet2の第一引数は省略されました。
ListやDictionalyなどのコレクションで活躍している
今回は自前でStudentクラスを用意しましたが、
ListとかDisctionalyなどクラスのメソッドは拡張メソッドで定義されているものがあります。
例えば、ListのWhereメソッドでみるとこんな感じ

一見すると引数にthisはありません。
しかし、定義に移動すると

やはり、第一引数にthisが現れます。
Whereメソッドは拡張メソッドで実装されていることがわかりますね。
なぜ拡張メソッドを定義するのか
拡張メソッドの定義はクラスやプロジェクト全体を通してのデザインが必要になります。
自分たちで定義したクラスでは特にです。
というのも、
通常のメソッドで実装した場合と、拡張メソッドで実装した場合とで、
使う側からの視点ではなにも違いを感じないからです。
同じ呼び出し方ができるメソッドゆえに、「何故その実装方法を採用するか」が重要と考えます。
プロジェクト全体を通して、通常の実装なのか、拡張メソッドでの実装なのか、
どのような実装が適しているか決めていきます。
利用を「限定」したいときに「拡張」する

定義したいメソッドが局所的に大活躍するけれども、全体でみるとほぼ使用されていない場合に有効です。
拡張メソッドは本体と分離ができているので、必要な場所だけメソッドを追加することができます。
「利用を限定したいなら継承でも同じことができるじゃないか」
という意見もあると思います。
そう、利用を限定しているということは言い換えると、特化です。
ライバルの一つは継承になります。
継承との比較するとき、継承のほうがより多くのことができます。
例えば新しくプロパティを持たせることもできますし、型そのものも独自の名前を付けられます。
逆に、プロパティを増やす予定がないならば、拡張メソッドを検討する余地があるでしょう。
自分の定義したクラスでないときに拡張メソッドで機能追加する
また、そもそもクラスの継承では手も足もでないことがあります。
外部のライブラリのクラスを利用していて、それがsealedで継承不可にされている場合です。
しかし、拡張メソッドは利用することができます。
クラスのソースコードを変更したりすることなく、既存のクラスを拡張できます。
利用者に「使う・使わない」をゆだねたいとき
利用者が必要な機能を使えるようにする仕組みとしても拡張メソッドが使えます。
例えば、List操作を再び例にみてみましょう。
特定の要素を探し出すFindメソッドであったり、
特定の要素が含まれているかを判定するExistsメソッドがあらかじめ実装されています。
これで十分ならば、拡張メソッドは不要かもしれません。
しかし、「グループ化するための操作」、「平均値を出す操作」、「DB操作と統合」する場合
Listの基本機能だけでは実現できません。
そんなとき、List操作はSystem.Linqを使うことにより拡張できます。
この一文を追加するだけで100以上の機能が追加されます。
このように利用者に選択肢を与えることができるのも拡張メソッドの機能の一つです。
まとめ
今回の記事を簡単にまとめます
- 拡張メソッドは普通のメソッドと同じように使える
- 拡張メソッドを作るときは通常実装と継承による実装と比較する
実装手段が複数ある時はなぜその手段なのかを考えたいところです(自戒)