【csharp】もうネストしない!C# の条件分岐をコンパクトにする最強テクニック集

C# の条件分岐をスマートに!Null チェックから値の代入までコンパクトにするテクニック集

C# でコードを書いていると、if 文がネストしたり、同じような条件分岐が何度も出てきたりすること、ありますよね。そんな時に役立つ、C# の新しい構文や演算子を使って条件分岐をよりコンパクトに記述する方法をご紹介します。可読性を保ちつつ、スッキリとしたコードを目指しましょう!

1. Null 条件演算子 (?. と ?[])

ご質問にもあった Null 条件演算子は、オブジェクトや配列が null かどうかをチェックする際に非常に便利です。

例:リストの要素数を安全に取得する


List<string> list = GetStringList(); // GetStringList() は null を返す可能性あり

// 従来の書き方
int count;
if (list != null)
{
    count = list.Count;
}
else
{
    count = 0;
}

// Null 条件演算子を使った書き方
int count = list?.Count ?? 0;

list?.Count は、listnull でなければ list.Count の値を返し、null であれば null を返します。さらに、Null 合体演算子 (??) を使うことで、null だった場合のデフォルト値 (ここでは 0) を簡潔に指定できます。

例:オブジェクトのプロパティに安全にアクセスする


Person person = GetPerson(); // GetPerson() は null を返す可能性あり

// 従来の書き方
string name = null;
if (person != null && person.Name != null)
{
    name = person.Name;
}

// Null 条件演算子を使った書き方
string name = person?.Name;

person?.Name は、personnull でなければ person.Name の値を返し、null であれば null を返します。

2. Null 合体代入演算子 (??=)

Null 合体代入演算子は、変数が null の場合にのみ右辺の値を代入する演算子です。変数の初期化やデフォルト値の設定を簡潔に行えます。

例:変数が null の場合に初期値を設定する


string message = null;

// 従来の書き方
if (message == null)
{
    message = "初期メッセージ";
}

// Null 合体代入演算子を使った書き方
message ??= "初期メッセージ";

3. 三項演算子 (?:)

簡単な if-else 文を一行で記述できる三項演算子は、コードを短くするのに役立ちます。

例:数値が正か負かを判定する


int number = GetNumber();

// 従来の書き方
string sign;
if (number > 0)
{
    sign = "Positive";
}
else
{
    sign = "Non-positive";
}

// 三項演算子を使った書き方
string sign = number > 0 ? "Positive" : "Non-positive";

条件式 (number > 0) が true の場合は : の左側の値 ("Positive") が、false の場合は右側の値 ("Non-positive") が変数 sign に代入されます。

ネストした三項演算子は可読性を損なう可能性があるため、複雑な条件分岐には if-else 文を使うことを推奨します。

4. パターンマッチング

C# 7.0 以降で導入されたパターンマッチングは、変数の型や値に基づいて条件分岐を行う強力な機能です。is キーワードや switch 式と組み合わせることで、より簡潔で表現力豊かなコードを書くことができます。

例:オブジェクトの型に基づいて処理を分岐する


object obj = GetObject();

// 従来の書き方
if (obj is string str)
{
    Console.WriteLine($"これは文字列です: {str.Length}");
}
else if (obj is int num)
{
    Console.WriteLine($"これは整数です: {num * 2}");
}
else
{
    Console.WriteLine("不明な型です");
}

// パターンマッチングを使った書き方
switch (obj)
{
    case string str:
        Console.WriteLine($"これは文字列です: {str.Length}");
        break;
    case int num:
        Console.WriteLine($"これは整数です: {num * 2}");
        break;
    default:
        Console.WriteLine("不明な型です");
        break;
}

is string str のように、型チェックと同時に変数を宣言し、その型にキャストされた状態で利用できます。

switch 式 (C# 8.0 以降) を使うと、さらに簡潔に記述できます。


object obj = GetObject();

string message = obj switch
{
    string str => $"これは文字列です: {str.Length}",
    int num => $"これは整数です: {num * 2}",
    _ => "不明な型です"
};

Console.WriteLine(message);

まとめ

C# の新しい構文や演算子を活用することで、条件分岐をよりコンパクトに、そして可読性の高いコードにすることができます。

  • Null 条件演算子 (?., ?[]): Null チェックをスマートに行う。
  • Null 合体代入演算子 (??=): Null の場合の初期化を簡潔に行う。
  • 三項演算子 (?:): 簡単な if-else を一行で記述する。
  • パターンマッチング (is, switch): 型や値に基づいた複雑な条件分岐を簡潔に記述する。