連載:[完全版]究極のC#プログラミングChapter14 拡張メソッド川俣 晶2010/03/01 |
|
|
14.11 拡張メソッドを使用すべきとき
さて、拡張メソッドはどのような場合に使用すべきだろうか? 逆に、どのような場合には使えないのだろうか?
まず、拡張メソッドには「メソッド」しか存在しないことを強調しておこう。プロパティやインデクサを拡張することはできない。あくまで「メソッド」だけである。このことだけで、拡張メソッドに期待された役割が限定された狭い範囲でしかないことがわかるだろう。可能であれば、拡張メソッドは使わないほうがよい。
また、拡張メソッドでは記述できない処理も多いことに注意を払おう。拡張メソッドは、あくまでオブジェクト外の存在であり、オブジェクト内部に手を出すことができない(リフレクションを使えば強引に割り込めるが、あまりお薦めできない)。
では、そもそも、なぜ拡張メソッドは必要とされたのだろうか?
その答えは、おそらく、主にLINQにある。LINQは、統一されたクエリを実現するために既存コレクション群への拡張を必要としていた。しかし、LINQはオプションであり、つねに使うものではない。うかつな拡張は、既存のソースコードとの互換性を失わせるかもしれない。そのように考えると、次のような特徴を持つ拡張メソッドは優れた選択であることがわかる。
- 既存のクラスを変更しない
- インポートしない限り有効にならない
- インポートすれば有効になるので、既存コードにすぐLINQの機能を追加できる(もし継承で実現していたら、追加機能を使うためにクラス名を書き換える必要が生じる)
逆にいえば、普通の手順で開発されているプログラムであれば、このような特殊事情はあまり見られず、拡張メソッドを使うメリットも見えにくい。
しかし、既存のクラスライブラリに対して、「このメソッドがあれば便利なのに」と思うことはあるだろう。たとえば、文字列に対して、ある業務で使用される特殊なハッシュコードを計算する処理が多発するなら、そのような計算を行うメソッドをstringクラスに追加してしまうのは有用だろう。そのような状況に対処する方法として、拡張メソッドは優れている。
INDEX | ||
[完全版]究極のC#プログラミング | ||
Chapter14 拡張メソッド | 1.14.1 C# 2.0プログラマーの悲劇 | |
2.14.2 Allメソッドを利用するのに必要な記述 | ||
3.14.3 拡張メソッドの概要 | ||
4.14.4 スイッチなしで機能する例 | ||
5.14.5 sealedクラスを拡張する | ||
6.14.6 拡張メソッドはオブジェクト内部に手出しできない | ||
7.14.7 拡張メソッドはオブジェクトの振る舞いを変更できない | ||
8.14.8 拡張メソッドが安全である理由 | ||
9.14.9 メソッド呼び出しと型の関係 | ||
10.14.10 thisの正体 | ||
11.14.11 拡張メソッドを使用すべきとき | ||
12.14.12 コレクションに拡張されるメソッド | ||
13.14.13 なぜ「using System.Linq;」なのか?/練習問題 | ||
「[完全版]究極のC#プログラミング」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|