こんばんは。水戸スヤです。
今日は拡張メソッドの便利な使い方を紹介します。
拡張メソッドとは、VisualStudio2008から導入された、
既に存在するクラスに対し、新たにインスタンスメソッドを追加できる機能です。
とても便利なのですが、
ちょっと用途を考えてみましょう。
自分で作成した「ClassA」があるとしましょう。
このクラスに新たにメソッドを追加したくなりました。
この際に、わざわざ別クラス/ファイルで定義するでしょうか?
答えはノーです。
ClassAが行いたい処理は、ClassAに定義するべきでしょう。
もちろん例外はあると思います。
など、大人の事情は考えられます。
でも僕はこれらのケースでも、
拡張メソッドで追加するべきではないと思います。
後のメンテナンス性が悪くなります。
じゃあどういう時に使うの?となりますよね。
僕が思うに、拡張メソッドの最大の使い道は、
.Net Frameworkの標準クラスに処理を追加したい場合です。
.Netの標準クラスは継承不可(c#でいうsealed、vbではNotInheritable)なクラスが多く、
ThreadクラスやMessageBoxクラスも継承することができません。
標準機能に大方満足なんだけど、
このメソッドを持たせたい!
なーんてことが従来できなかったわけですが、
拡張メソッドを使用するとこれができます。
ではちょっとしたサンプルを作ってみます。
通常、string配列はイミディエイトウインドウでは下記のように表示してくれます。
中身まで表示してくれて便利ですよね。
しかし、実際にTextBox等に出力しようとして、
ToString()を呼び出すと下記のようになってしまいます。
まったく不要な情報ですね?
はい。私がほしいのは、配列の中身をダンプするメソッドです。
ここで配列型の拡張メソッドを作成します。
using System;
namespace ExtensionSample
{
public static class ArrayExtention
{
public static string ToStrings(this object[] array)
{
string[] strArray = Array.ConvertAll
上記の拡張メソッド作成後、
使いたい箇所で下記のようにToStringsメソッドを使用します。
using System;
using System.Windows.Forms;
namespace ExtensionSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string[] array = new string[] { "AAAAA", "BBBBB", "CCCCC" };
//textBox1.Text = array.ToString(); 意味のない出力
textBox1.Text = array.ToStrings();
}
}
}
こんな感じに出ます。
拡張メソッドは、継承不可クラスに対して作成してこそメリットがあるということが伝わりましたでしょうか。
使い方は他にもたくさんあります。
世の中が、可読性が高いPGで溢れることを夢見る水戸スヤでした。