Edited at

[C#]ちょっとしたストレスを解消してくれるExtensions

More than 3 years have passed since last update.


ちょっとした面倒くささ

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));

スッキリ!!


おわりに

拡張メソッドを使って、スッキリ、コーディング楽しみましょう。