ちょっとした面倒くささ
C#は良い言語です。強い型付けを持ちつつ、型推論で何も考えずにかける強さが、良い所。
しかし、そんなC#ですが、
コード書いていて、たまにストレス感じるところがあります。
例えば、
var value = "hoge";
if(String.IsNullOrEmpty(value))
value = "empty";
や
var dict = new Dictionary<string, int>() {
{ "1", 1 },
{ "2", 2 },
{ "3", 3 },
};
var value = 0;
dict.TryGetValue("0", out value);
のようなやつ。
よく書くものなだけに、ちょっとしたストレスが、容赦なく作業効率を落としてくれやがります(´・ω・`)
こういうちょっとしたストレスは、C#3から対応されている、__「拡張メソッド」__を使って、解消することができます。
今回は、積極的に拡張メソッドにするといいよ、というお話。
拡張メソッドを作る
最初の例では、こんなものを作って対応します
public static class StringExtensions {
public static bool IsNullOrEmpty(this string source) {
return String.IsNullOrEmpty(soruce);
}
}
このような拡張を、usingしてあげると、このように書けるようになります。
var value = "hoge";
hoge.IsNullOrEmpry();
// もちろん直接もいける
"hoge".IsNullOrEmpty();
拡張メソッドを書くときは必ず、
staticなクラスに、staticなメソッド、且つ、最初の引数に__this__をくっつけて書く
必要があります。
くっつけた__this__。このthisがくっついている引数は、
拡張メソッドを呼び出したインスタンスを、暗黙的にバインドする動きをします。
つまり、呼び出したインスタンスそのものが、拡張メソッドの第1引数にあてがわれて動作するわけです。
この特性を使って、ちょっとしたストレスを感じるコードを、ガンガン拡張メソッドに切り出していく。
そうすると、メソッドチェーンで気持よ〜〜〜く書けるようになります。らくちん。
あるとオススメ
便利な拡張メソッドは、大量にあるのですべて紹介できませんが、
自分がよく使うものだけ、少しだけ紹介します。
Dictionary.TryGetValue
TryGetValue()をラップするものです。outが気持ち悪いので、拡張メソッドでラップしてあげます。
public static class DictionaryExtensions {
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> source, TKey key
) {
if(source == null || source.Count == 0)
return default(TValue);
TValue result;
if(source.TryGetValue(key, out result))
return result;
return default(TValue);
}
}
var dict = new Dictionary<string, int>() {
{ "1", 1 },
{ "2", 2 },
{ "3", 3 },
};
// これが、
var value = 0;
dict.TryGetValue("0", out value);
// こう書ける
dict.GetValueOrDefault("0")
スッキリ!!
String.Formats
文字列操作は、出力に、ログに、いろんな場所で使います。
頻度が高い文、毎度毎度、__String.Format()__を書くのが面倒です。
とにかく面倒なので、拡張メソッドにしてしまいます。
public static class StringExtensions {
public static string Formats(this string format, params object[] values) {
return String.Format(format, values);
}
}
Console.WriteLine("write {0}.".Formats(1));
スッキリ!!
##おわりに
拡張メソッドを使って、スッキリ、コーディング楽しみましょう。