PR

[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# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント