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 許容型の比較は次のようになります。
nullとnullの比較は「一致」nullとnull以外の比較は「不一致」null以外同士の比較は値が同じであれば「一致」

0 件のコメント:
コメントを投稿