2018年4月17日火曜日

さらに立ち止まって、拡張メソッドの研究

前々回のエントリーで出て来た下記のリスト、この中で記述されているのが、前回のエントリーで研究したラムダ式と、今日やる拡張メソッドです。

using System;
using System.Collections.Generic;
using System.Linq;

public static class IEnumerableExtensions
{
    public static int Nearest(this IEnumerable<int> self, int target)
    {
        var min = self.Min(c => Math.Abs(c - target));
        return self.First(c => Math.Abs(c - target) == min);
    }
}

拡張メソッドとは何か?という簡単な説明が、Qiitaのkuwapp様記事にありました。

メソッドを追加しようと思ったら、普通はソースを編集してメソッドを追加して再コンパイルするか、派生クラスを作るしかないのですが、この拡張メソッドはそれをせずにクラスの追加が出来るように見えるものです。

上記で引用させていただいた記事には具体的に記述方法の説明はありません。記述方法などに関する詳しい説明は、いつも勉強させていただいている++C++ ; //未確認飛行 C様の記事にあります。

静的クラスの中に静的メソッドを定義し、その中で第一引数にthis修飾語を付けた静的メソッドを定義する、ということのようです。

下記リストではこの拡張メソッドを、スライス画像を描くためのメソッドの中で呼び出していますが、それは下記のように記述しています。

        /*
         * スライス画像を作成する
         */
         private void drawSlice()
        {
            Bitmap img = new Bitmap(Constants.size_slicebox_x, Constants.size_slicebox_y);
            MessageBox.Show("Slice by "+x_axis.Nearest(mouse_x));  //描画は未実装、座標をメッセージボックスに
        }

x_axisというArrayListには、Nearestというメソッドは元々ありませんが、拡張メソッドを定義しているので、あたかもメソッドが拡張されたかのように記述できている、という訳です。

拡張メソッドについては、ここまでにします。

0 件のコメント:

コメントを投稿

コメントを頂ければ幸いです。