[C# 入門] nullが入るかもしれない変数にはnull合体演算子(??)とnull条件演算子(?)を使うと便利

nullが入る可能性のある値を扱うときに便利なnull合体演算子(??)null条件演算子(?)を紹介します。

これらを使うと変数の値がnullだった時に既定の値を設定したり、中身(インスタンス)が入っている時だけメンバーにアクセスするということができるようになります。

スポンサーリンク

null合体演算子(??)

nullが入る可能性のある型を使うときにnull合体演算子(??)が活躍します。
なにができるかというと、
ある変数を代入するときにその値がnullだった場合に違う値を代入することができます。

using System;
class Program
{
    public static void Main()
    {
        // nullが入る可能性のある変数
        int? nullableValue = null;

        // ??の左辺がnullだったら右辺を代入する
        int value = nullableValue ?? 10;

        Console.WriteLine(value);  // 10
    }
}

null合体演算子(??)は辺の値がnullだった時に辺の値を返します。
10行目の、nullableValue ?? 10 の部分はnullableValueにnullが入っているので10を返します。そして10が int型変数value に代入されます。

スポンサーリンク

null合体演算子(??)と 代入演算子(=)

さらに ??= という謎だらけの演算子もあります。C#8.0から使えます。
これは??=左辺がnullの場合に右辺の値を代入します。

using System;
class Program
{
    public static void Main()
    {
        // nullが入る可能性のある変数
        int? nullableValue = null;

        // ??の左辺がnullだったら右辺を代入する
        nullableValue ??= 10;

        Console.WriteLine(nullableValue); // 10
    }
}
スポンサーリンク

null条件演算子(?)

こちらは控えめで?マーク1つです。
null条件演算子(?)クラスのメンバーへのアクセス配列の要素へのアクセス時に使います。通常、クラスや配列のインスタンスがない(null)状態でメンバー、要素にアクセスしようとするとエラーになってしまいますが、?を使うとその式はnullを返します。

?はクラス、配列の後に付け、そのあと通常のメンバー、要素へのアクセスを行います。

クラス?.メンバー
配列?[インデックス]

サンプルコードです。

using System;
class Program
{
    public static void Main()
    {
        // インスタンスがない状態の配列
        int[] intArray = null;

        // ?を使って要素にアクセス
        Console.WriteLine((intArray?[0]) is null);  // True

        // クラスのインスタンスがない状態の変数
        TestClass cls = null;

        // ?を使ってメンバーにアクセス  cls?.number
        Console.WriteLine((cls?.number) is null);  // True
    }
}

class TestClass 
{
    public int number = 10;
}

10行目、16行目はどちらもnullになります。

スポンサーリンク

null条件演算子(?)と null合体演算子(??)

null条件演算子(?)はnull合体演算子(??)と合わせて使うと真の力を発揮します。
? でnullだったら ?? で代わりの値を返す ということができます。

using System;
class Program
{
    public static void Main()
    {
        // インスタンスがない状態の配列
        int[] intArray = null;

        // ?を使って要素にアクセス intArrayがnullだったら10を代入
        Console.WriteLine(intArray?[0] ?? 10);

        // クラスのインスタンスがない状態の変数
        TestClass cls = null;

        // ?を使ってメンバーにアクセス clsがnullだったら20を代入
        Console.WriteLine(cls?.number ?? 20);
    }
}

class TestClass 
{
    public int number = 10;
}

出力結果はこんな感じ。

10
20

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました