MRが楽しい

MRやVRについて学習したことを書き残す

C#でオブジェクトのnull判定を行うときにReferenceEqualsを利用する

本日は C# の小ネタ枠です。
C# の null 判定では ReferenceEquals を利用すべきというお話です。
(または C# 8.0 以降では is null)

ReferenceEquals

ReferenceEquals は指定した Object インスタンスが同一インスタンスかどうかを判断します。
learn.microsoft.com

object obj = null;

if (Object.ReferenceEquals(obj, null)) { // null 時処理 }

等価演算子の問題点

オブジェクトの null 判定のよくある方法として等価演算子を利用する方法があります。

object obj = null;

if (obj == null) { // null 時処理 }

ただし等価演算子を利用する場合は対象オブジェクトのクラスが等値演算子の処理をオーバーロードしていた場合に問題が発生します。
例えば下記のケースでは NullReferenceException が発生します。

ObjectSample obj = null;
if (obj == null) { // null 時処理 }

class ObjectSample
{
    public static bool operator ==(ObjectSample x, ObjectSample y) => x.Equals(y);
    public static bool operator !=(ObjectSample x, ObjectSample y) => !x.Equals(y);
}

一方で ReferenceEquals は参照の等価性をチェックする関数のため、等価演算子の処理は呼び出されず、対象の参照が null であるかのみを必ずチェックできます。
このため、オブジェクトの null 判定を行いたい場合は等価演算子ではなく ReferenceEquals を利用した方が安全です。

is null

C# 8.0 以降はポインターに対してもパターンマッチングが使えるため、以下のように安全に null 判定をすることもできます。

object obj = null;

if (obj is null) { // null 時処理 }

参考ページ

ufcpp.net
ufcpp.net
qiita.com