8
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Null条件演算子をもっと便利にする拡張メソッド

Last updated at Posted at 2017-06-06

C#6.0から導入されたNull条件演算子(?.)は非常に便利です。

// nullチェックを行ってから実行していた構文が
if (hoge != null) { hoge.Piyo(); }

// nullチェック込みで簡潔に書ける
hoge?.Piyo();

ただし、Null条件演算子が適用できないケースもちょこちょこあります。

// nullじゃない場合にPropertyに代入したい
if (hoge != null)
{
    hoge.Fuga="ほげほげ";
}
//これはコンパイルエラー
//hoge?.Fuga = "ほげほげ";


// nullじゃない場合に、何かのメソッドの引数として実行したい。
var list = new List<string>();
if (str != null) 
{
    list.Add(str);
}
//構文的にあてはまるものがない...
//list.Add(str?);

そんなときには、以下のような拡張メソッドを定義しておくと何かと便利です。

/// <summary>
/// Actionを実行します。
/// </summary>
/// <param name="obj"></param>
/// <param name="action"></param>
public static void Invoke<T>(this T obj, Action<T> action) => action(obj);

/// <summary>
/// Funcを実行します。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="V"></typeparam>
/// <param name="obj"></param>
/// <param name="func"></param>
public static V Invoke<T, V>(this T obj, Func<T, V> func) => func(obj);

一見特筆すべき点の何もないどう使ってよいかわからない拡張メソッドですが、Null条件演算子と組み合わせるとそこそこ便利です。

// 例えば上の方で書いた例だと
// nullじゃない場合に代入(ちょっと冗長。。)
hoge?.Invoke(h => h.Fuga = "ほげほげ");

// nullじゃない場合にメソッド呼び出し
str?.Invoke(list.Add);

// nullable型も、Valueの取り出しが自然に行えます。
int? ni = GetNullableInteger();
ni?.Invoke(i /* ここにはni.Valueがわたってくる */ => Console.WriteLine(i));

と、ifを書きたくない人にオススメですw
//if 書くとLambdaがExpression Bodyで書けないとかとか?

8
13
2

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
8
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?