Open3

C#におけるnull関係の仕様

tmdtmd

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;

Microsoft Learn > ?? と ??= 演算子 - null 合体演算子

tmdtmd

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 と判定
}

Microsoft Learn > null 許容値型