プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2019/04/03

[C#] Null 条件演算子いろいろ

event_note2019/04/03 2:39

Null 条件演算子を使えば条件文を減らせるので便利ですが、ちょっと注意するべき点もあるので、挙動の確認を行いました。

基本

例えば以下のようなクラスがあった場合。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

以下のコードは null が出力されます。

Person person = null;
Console.WriteLine($"Name:{person?.Name}");

実行結果

Name:

Null 条件演算子がなければ例外が発生します。

条件文での使用

if 文

以下のように条件文で使用した場合、null と数値との比較になるので、結果は false になります。

Person person = null;

if(person?.Age >= 0)
{
    Console.WriteLine($"0 以上");
}
else if(person?.Age <= 0)
{
    Console.WriteLine($"0 以下");
}
else
{
    Console.WriteLine($"false");
}

実行結果

false

switch 文

Person person = null;

switch (person?.Age)
{
    case null:
        Console.WriteLine($"null");
        break;
    default:
        Console.WriteLine($"数値");
        break;
}

実行結果

null

値の代入

Null 条件演算子の戻り値は Null 許容型となるため、以下はビルドに失敗します。

// ビルドエラー
Person person = null;
int age = person?.Age;
// ビルドは通るが例外が発生する
Person person = null;
int age = (int)person?.Age;
// これは OK
Person person = null;
int? age = person?.Age;

または、 Null 条件演算子を使ってメンバーへの代入はできません。

// ビルドエラー
Person person = null;
person?.Age = 10;