http://blogs.wankuma.com/rti/archive/2007/11/20/109453.aspx
C#3.0の新機能を使ってみる(その1)
http://blogs.wankuma.com/rti/archive/2007/11/19/109158.aspx
お疲れ様でした
の続きです。
昨日は、C#3.0 の新機能である
拡張メソッド
を使う部分を話題にしました。
しかし、ちょっと説明が不親切だったように思うので、更に噛み砕くことにします。
まずは、char 型に数値が含まれていた場合に、decimal 型の値に変換して値が取得できるようなメソッドを追加した部分です。
public static decimal ToDecimal(this char c) {
var r = 0m;
if (decimal.TryParse(c.ToString(), out r)) return r;
throw new ArgumentException();
}
これで、char 型に ToDecimal() メソッドが追加されたことになります。
char c = '5';
decimal d = c.ToDecimal();
のように扱うことができる訳です。
次に、文字列型の桁位置を指定して、その桁の値を decimal 型として受け取るメソッドを string 型に追加した部分が以下になります。
public static decimal GetOneDigit(this string value, int digitIndex) {
if (digitIndex < 0 || digitIndex > value.Length - 1) return 0m;
return value[value.Length - (digitIndex + 1)].ToDecimal();
}
これによって、string 型に GetOneDigit() メソッドが追加されたことになります。
string 型 value は、char型の値を返すインデクサを持っているので、 value[0] でchar型が返ります。
ここで、先ほど作成した ToDecimal() メソッドを実際に利用して、char 型を decimal 型に変換しています。
string s = "9876543210";
decimal d1 = s.GetOneDigit(1);
decimal d9 = s.GetOneDigit(9);
d1 には、1 が、d9 には、9 が格納されます。
基本的に既存のクラスにメソッドを追加する場合、派生されたクラスにてメソッドを追加することが多いのですが、シールされたクラスにメソッドを追加したい場合は、この方法が使えません。
従って、新設したクラスでオブジェクトをラッピングして、オブジェクトとの連絡用にメンバを追加した上で、メソッドを追加するなどの方法をとっていました。
拡張メソッドは、シールされた静的なクラスにメソッドを追加したい場合に、有効な方法と言えるのかもしれません。
(つづく)