拡張メソッドは、C# 3.0 (2007/11)の機能になります。

System.DateTime には、なぜか末日を得るためのメソッドが提供されていません。
こんな時、継承して独自クラスを作っても良いですが、以下のような拡張メソッドを
作成することでも解決できます。

static class MyExtension
{
    static DateTime LastDate(this DateTime d)
    {
        return new DateTime(d.Year, d.Month, DateTime.DaysInMonth(d.Year, d.Month));
    }
}

利用する部分では、以下のように使うことができます。

class Program
{
    static void Main(string[] args)
    {
        DateTime endDate = DateTime.Now.LastDate();
    }
}

インタフェース等外部で決まったものに対しメソッドを足せるのですが、
それ以外の利点を考えてみたいと思います。

普通のメソッド呼び出しだと、以下のようになるかと思います。

static DateTime GetLastDate(DateTime d)
{
    return new DateTime(d.Year, d.Month, DateTime.DaysInMonth(d.Year, d.Month));
}

static void Main(string[] args)
{
    DateTime endDate = GetLastDate(DateTime.Now);
}

これだと、左から右に読むと「末日を取得する(何の?)。当月の。」となります。
ところが、拡張メソッドだと、「当月の末日」と素直に読めます。

他にも私がよく使っているものを紹介します。
SQLの between と同じような感覚で使える以下のメソッドがあると、
不等号を2つ書くより意味がわかって良いと思います。

public static bool Between(this T val, T from, T to) where T : IComparable
{
    // 大小関係が逆の場合、補正する
    if (from.CompareTo(to) > 0) Swap(ref from, ref to);
    return (from.CompareTo(val) <= 0 && val.CompareTo(to) <= 0);
}

public static void Swap(ref T a, ref T b)
{
    T temp = a;
    a = b;
    b = temp;
}

以上

TOP
TOP