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