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で書けないとかとか?