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

2018/07/02

C# の Null 判定いろいろ

event_note2018/07/02 1:50

Null 判定はできるだけシンプルに行いたいものですが、たまにどう書けばよいのかわからなくなってしまうので、まとめてみました。

以下の環境で試しました。

  • Visual Studio 2017
  • .NET Core 2.1
  • C# 7.2

単純な Null 判定

例として、以下のような string 型の変数を例にします。

string foo;

愚直に if 文で判定すると、以下のような感じになります。

if (foo == null)
{
    Console.WriteLine("foo is null");
}
else
{
    Console.WriteLine(foo);
}

三項演算子による Null 判定

三項演算子を使えば以下のようにかなりシンプルになります。

Console.WriteLine(foo == null ? "foo is null" : foo);

と、ここまでなら C 言語などでも書けますが、C# ではもっとスマートに書けます。

Null 合体演算子による Null 判定

Null 合体演算子 (??演算子) を使用すれば、変数名の記述が一回で済み、条件判定も不要になります。

Console.WriteLine(foo ?? "foo is null");

Null 条件演算子

参照型のメンバーや、配列の要素などにアクセスしたい場合、愚直に Null を判定すると以下のような感じになります。

string foo = "abc";

if (foo != null)
{
    Console.WriteLine(foo[0]);
    Console.WriteLine(foo.ToUpper());
}

Null 条件演算子 (?. ?[]) を使うと、以下のようにシンプルに書けます。

Console.WriteLine(foo?[0]);
Console.WriteLine(foo?.ToUpper());

Null 合体演算子を組み合わせれば、foonull の場合の処理も簡単に書けます。

Console.WriteLine(foo?[0].ToString() ?? "foo is null");
Console.WriteLine(foo?.ToUpper() ?? "foo is null");

第1、第2オペランドの型が違う場合はコンパイルエラーになるようなので、ToString() で型を合わせています。

Null 許容型

C# では Null 許容型というのがあり、値型にも Null を代入できるようになります。

int? foo = null;

この場合、以下のように Null 判定ができます。

if(foo.HasValue) // if(foo != null) も可
{ 
    Console.WriteLine(foo); // foo.Value も可
}
else
{
    Console.WriteLine("foo is null");
}

これも、Null 合体演算子と Null 条件演算子を使うことで以下のように書けます。

Console.WriteLine(foo?.ToString() ?? "foo is null");

第1、第2オペランドの型が違う場合はコンパイルエラーになるようなので、ToString() で型を合わせています。

第1、第2オペランドが同じ型であれば、以下のように書けます。

Console.WriteLine(foo ?? 0);