拡張メソッドは、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; }
以上