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 合体演算子を組み合わせれば、foo
が null
の場合の処理も簡単に書けます。
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);