準備
(なし)
デザイン
1. フォーム (Form1) にボタン (button1) を配置します。
サンプルコード (C#)
// 名前空間の追加 // (なし) // クラスの宣言 internal static class ExtClass { internal static void Print(this string s) { Console.WriteLine(s); } } // コード private void button1_Click(object sender, EventArgs e) { string s1 = "Hello, World!"; ExtClass.Print(s1); s1.Print(); }
解説
拡張メソッドとは、定義されているメソッドを自オブジェクトのメソッドのように扱う方法です。このサンプルの場合は、Print メソッドが拡張メソッドとして扱われます。C#, VB.NET どちらとも変数 s1 の宣言後の次のステートメントで、s1 の内容を出力していますが、1 行目は通常の方法で、2 行目が拡張メソッドによる方法です。
C# は拡張メソッドを Internal の static クラス内で定義します。VB.NET ではモジュールに定義する必要があります。
拡張メソッドに指定するためには、C# は this キーワードを、VB.NET は キーワードを使います。
通常であれば、独自のメソッドはクラス内に定義して、クラスをインスタンス化することでメソッドを使うことがオブジェクト指向の基本とも言えますが、スタティッククラスが導入されて以来、インスタンス化せずに独自メソッドを使うようになってしまいました。この方法はオブジェクト指向の考え方から外れていますが、そもそも .NET 標準のクラスにもスタティックメソッドがあることですし、自分では容認できると考えています。しかし、クラス名.メソッド名が意外と長くなりがちで、コードの可読性が落ちてしまうことが気になっていました。そこで、この拡張メソッドを使うと、クラス名を記述することなく、メソッドを呼び出すことができるので重宝しそうです。しかし、もっとオブジェクト指向の考え方から外れていきそうな気がします。しかし、そもそも .NET の新機能として実装されているわけですから、使ってもよいかと考えています。
結果
動作確認環境
Visual Studio 2015 Professional (C# 6.0)