連載:[完全版]究極のC#プログラミングChapter14 拡張メソッド川俣 晶2010/03/01 |
|
|
14.3 拡張メソッドの概要
拡張メソッドは、すでに存在するクラスに対して、そのクラスを変更することなく、メソッドを追加できる機能である。
まず、最もシンプルな例を見てみよう。
次のリスト14.5は、名前空間YにあるクラスAを変更することなく、メソッドMyMethodを追加するものである。
| |
リスト14.5 最も単純な拡張メソッドの使用例 |
このサンプルコードで、名前空間Yにはなんら特別な構文は存在しない。ここで注目すべきは、名前空間X内のコードと「using X;」の2つである。
拡張メソッドは、次の条件を満たすメソッドを記述することで作成できる。
- 静的なメソッド(static)である
- 静的クラス(static)に記述されている
- 第1パラメータの先頭にthisキーワードが前置されている
- 第1パラメータの型がメソッドを追加すべき型である
これで、このメソッドは、あたかも「第1パラメータの型」のメソッドであるかのように呼び出すことができる。「a.MyMethod();」というメソッド呼び出しがそれである。
ところで、「名前空間Yにはなんら特別な構文は存在しない」と書いたが、それは厳密には正しくない。「a.MyMethod();」という呼び出しは、実は拡張メソッドを呼び出す専用構文なのである。一見、なんら特別な構文には見えないかもしれないが、本来このメソッドが受け取るはずの第1パラメータに引数を渡していない点に注意を払っていただきたい。つまり、本来存在する引数を自動的に補って呼び出しを行うという特別な構文なのである。
では、第1引数はどうやって補われるのだろうか? それは使用されたインスタンスそのものである。「a.MyMethod();」であれば、「a」が第1引数に補われる。したがって、リスト14.5においては、以下の2つのメソッド呼び出しは実質的に同じ機能性を持つ。
a.MyMethod();
B.MyMethod(a);
さて、最後の注目すべき点は「using X;」である。拡張メソッドは、拡張メソッド自身を含む名前空間をusing文で指定しない限り有効にならない。つまり、定義しただけでは使用できず、スイッチを入れなければならない。これを「拡張メソッドをインポートする」という。実際、リスト14.5で「using X;」をコメントアウトすると、次のようなコンパイルエラーが発生する。
| |
リスト14.5で「using X;」をコメントアウトすると発生するコンパイルエラー |
「[完全版]究極の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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|