Open3
C#におけるnull関係の仕様
?.
や ?[]
)
null条件演算子 (-
a
がnull
と評価されたとき、a?.x
またはa?[x]
の結果はnull
となる -
a
が null以外 と評価されたとき、a?.x
またはa?[x]
の結果はa.x
またはa[x]
の結果と同じ
??
と ??=
)
null合体演算子 (
??
-
??
は、左側のオペランドが null ではない場合、左側のオペランドの値を返す
int? a = null;
int? b = 5;
Console.WriteLine((a ?? 3)); // a is null であるため、3となる
Console.WriteLine((b ?? 3)); // b is NOT null であるため、5となる
??=
-
??=
は、左側のオペランドがnull
と評価された場合のみ、右側のオペランドの値を左側のオペランドに代入する
int? a = null;
int? b = 5;
Console.WriteLine((a ??= 0)); // 0: a is null であるため、a に 0 が代入される
Console.WriteLine((b ??= 0)); // 5: b is NOT null であるため、式の結果は 5 のままとなる
左側のオペランド
- 変数、プロパティ、またはインデクサー要素である必要がある
- null許容値型である必要がある
置き換えのパターン
// 元のコード
if (variable is null)
{
variable = expression;
}
// 置き換え後のコード
variable ??= expression;
<
, >
, <=
, >=
) / 等値演算子(==
, !=
)
nullと比較演算子(比較演算子
- 比較演算子でどちらか一方のオペランドが
null
の場合、結果はfalse
となる - 以下のケースではすべて結果は
false
である
int? a = 10;
Console.WriteLine($"{a >= null}"); // false
Console.WriteLine($"{a <= null}"); // false
Console.WriteLine($"{a > null}"); // false
Console.WriteLine($"{a < null}"); // false
等値演算子
- 等値演算子(
==
)では、両方のオペランドがnull
の場合、結果がtrue
となる- 一方のオペランドだけが
null
の場合、結果はfalse
となる
- 一方のオペランドだけが
- 非等値演算子(
!=
)では、両方のオペランドがnull
の場合、結果がfalse
となる- 一方のオペランドだけが
null
の場合、結果はtrue
となる
- 一方のオペランドだけが
Any (Enumerable.Any)
C#で List など IEnumerable を実装するクラスで、以下のような判定がしばしば行われることがある。
// list は List<T> 型の変数とする
if (list != null && list.Count > 0)
{
// list が値を保持する場合の処理
}
if (list == null || list.Count == 0)
{
// list が値を持たない場合の処理
}
これはそれぞれ以下のように置き換え可能である
if (list?.Any() == true)
{
// list が null の場合、 null == true の結果は false と判定
// list が null ではなく Any() の結果が true の場合 true == true の比較により true と判定
}
if (list?.Any() != true)
{
// list が null の場合、 null != true の結果は true と判定
// list が null ではなく Any() の結果が false の場合 false != true の比較により true と判定
}