LoginSignup
64
62

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-25

ちょっとした面倒くささ

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

スッキリ!!

おわりに

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

64
62
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
62