.net

【.net】拡張メソッドの便利な使い方

こんばんは。水戸スヤです。

今日は拡張メソッドの便利な使い方を紹介します。


拡張メソッドとは

拡張メソッドとは、VisualStudio2008から導入された、
既に存在するクラスに対し、新たにインスタンスメソッドを追加できる機能です。

とても便利なのですが、
ちょっと用途を考えてみましょう。

自分で作成した「ClassA」があるとしましょう。
このクラスに新たにメソッドを追加したくなりました。
この際に、わざわざ別クラス/ファイルで定義するでしょうか?

答えはノーです。
ClassAが行いたい処理は、ClassAに定義するべきでしょう。

もちろん例外はあると思います。

  • ClassAは第三者が作った
  • ClassAの品質は担保されている
  • ClassAは既に稼働中

など、大人の事情は考えられます。
でも僕はこれらのケースでも、
拡張メソッドで追加するべきではないと思います。
後のメンテナンス性が悪くなります。

じゃあどういう時に使うの?となりますよね。
僕が思うに、拡張メソッドの最大の使い道は、
.Net Frameworkの標準クラスに処理を追加したい場合です。

.Netの標準クラスは継承不可(c#でいうsealed、vbではNotInheritable)なクラスが多く、
ThreadクラスやMessageBoxクラスも継承することができません。

標準機能に大方満足なんだけど、
このメソッドを持たせたい!
なーんてことが従来できなかったわけですが、
拡張メソッドを使用するとこれができます。


サンプルソース

ではちょっとしたサンプルを作ってみます。
通常、string配列はイミディエイトウインドウでは下記のように表示してくれます。

イミディエイトウインドウの表示

中身まで表示してくれて便利ですよね。
しかし、実際にTextBox等に出力しようとして、
ToString()を呼び出すと下記のようになってしまいます。

ToString()の末路

まったく不要な情報ですね?
はい。私がほしいのは、配列の中身をダンプするメソッドです。
ここで配列型の拡張メソッドを作成します。


using System;

namespace ExtensionSample
{
    public static class ArrayExtention
    {
        public static string ToStrings(this object[] array)
        {
            string[] strArray = Array.ConvertAll(array, o => $"\"{o.ToString()}\"");
            return string.Join(Environment.NewLine, strArray);
        }
    }
}

上記の拡張メソッド作成後、
使いたい箇所で下記のように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();
        }
    }
}

こんな感じに出ます。

ToStringsは良い

拡張メソッドは、継承不可クラスに対して作成してこそメリットがあるということが伝わりましたでしょうか。
使い方は他にもたくさんあります。
世の中が、可読性が高いPGで溢れることを夢見る水戸スヤでした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です