どうなる? null 許容型(Nullable)の比較

2021年7月27日火曜日

C#

t f B! P L

null 許容型の System.Nullable<T> を比較演算子や Equals メソッドで比較すると、どのような結果になるのか調べてみた。

Equalsメソッド

Equals メソッドは、2つのオブジェクトが一致するかを判定するメソッドです。

では、int? などの null 許容型でも、int, DateTimeなどの値型と同じように Equals メソッドが使えるのであろうか?null 許容型の変数に対し、様々なパターンで Equals メソッドを呼び出した結果は次の通りです。

null 同士の比較

2つの変数に共に null が格納された int?型の変数に対して Equals メソッドを呼ぶと、想定通り trueとなる。

int? a = null;
int? b = null;
Console.WriteLine(a.Equals(b));  // -> True

これは Object#Equals メソッドを使った比較でも、同じ結果が得られる。

int? a = null;
int? b = null;
Console.WriteLine(Object.Equals(a, b));  // -> True

null と 非 null の比較

null と null 以外の値が格納された変数の比較は、当然のことながら結果は False となる。

int? a = 1;
int? b = null;
Console.WriteLine(a.Equals(b));  // -> False

null 許容型と通常の値型の比較

2つの変数の一方が null 許容型で、もう一方が通常の値型の場合の比較も、値が同じであれば想定通り一致の判定をしてくれる。

int? a = 1;  //通常の値型
int b = 1; //null許容方
Console.WriteLine(a.Equals(b));  // -> True

Object#Equals メソッドを使った比較でも、同じ結果が得られる。

int a = 1;  //通常の値型
int? b = 1; //null許容方
Console.WriteLine(Object.Equals(a, b));  // -> True

もちろん DateTime のような値型でOK

ここまで int 型の null 許容型で説明してきましたが、DateTime 型の null 許容型でも Equals メソッドは想定通りに比較してくれます。

DateTime? a = null;
DateTime? b = null;
Console.WriteLine(a.Equals(b));  // -> True

a = DateTime.Now.Date;
b = DateTime.Now.Date.AddDays(1);
Console.WriteLine(a.Equals(b));  // -> False

a = DateTime.Now.Date;
b = DateTime.Now.Date;
Console.WriteLine(a.Equals(b));  // -> True

比較演算子の場合

お次は == != >= <= などの比較演算子で null 許容型の値を比較した場合について検証した。

null 同士の比較

2つの変数に共に null が格納された int?型の変数に対して、 == != >= <= の4つの比較演算子で比較した結果が次の内容だ。おおむね想定通りの結果であろう。

int? a = null;
int? b = null;
Console.WriteLine(a == b);  // -> True
Console.WriteLine(a != b);  // -> False
Console.WriteLine(a >= b);  // -> False
Console.WriteLine(a <= b);  // -> False

null と 非 null の比較

null と null 以外の値が格納された変数の比較は次のとおりです。こちらもおおむね想定通りの結果であろう。

int? a = 1;
int? b = null;
Console.WriteLine(a == b);  // -> False
Console.WriteLine(a != b);  // -> True
Console.WriteLine(a >= b);  // -> False
Console.WriteLine(a <= b);  // -> False

null 許容型と通常の値型の比較

Equals メソッドの時と同様に、2つの変数の一方が null 許容型で、もう一方が通常の値型の場合の比較も、想定通りの判定をしてくれる。

int a = 1;
int? b = 2;
Console.WriteLine(a == b);  // -> False
Console.WriteLine(a != b);  // -> True
Console.WriteLine(a >= b);  // -> False
Console.WriteLine(a <= b);  // -> True

まとめ

null 許容型の System.Nullable<T> を比較演算子や Equals メソッドで比較した時の結果について検証してきました。

ここまでの結果をまとめると null 許容型の比較は次のようになります。

  • nullnullの比較は「一致」
  • nullnull以外の比較は「不一致」
  • null以外同士の比較は値が同じであれば「一致」
スポンサーリンク

QooQ