Проверьте, является ли объект нулевым, не используя ==

В моей программе у меня есть объекты, полученные из словаря. Мне нужно проверить, равны ли 2 объекта, поэтому я сделал оператор перегрузки ==.

Но позже мне нужно проверить, является ли объект нулевым.

If (object == null)  
{...}

Таким образом, в этот момент программа переходит к операции перегрузки, которую я определил, но выдает исключение NullReferenceException, поскольку один из сравниваемых объектов является нулевым.

Поэтому в рамках операции перегрузки мне нужно проверить, является ли один объект нулевым, но без использования ==, так как это даст мне исключение StackruException.

Как я могу это проверить?

5 ответов

Решение

В моей программе у меня есть объекты, полученные из словаря.

Я бы сильно пересмотрел вывод из Dictionary на первом месте. Это очень редко хорошая идея. Любите композицию, а не наследование в целом, и тщательно продумайте, как вы хотите, чтобы равенство (и хэш-коды) вели себя в условиях изменчивости данных. Обычно это плохой знак, если два объекта равны в одной точке, а потом не равны.

Таким образом, в этот момент программа переходит к операции перегрузки, которую я определил, но выдает исключение NullReferenceException, поскольку один из сравниваемых объектов является нулевым.

Это проблема. Ваш перегружен == оператор не должен выдавать исключение - он должен сравнивать значение с null,

Обычно перегрузка == выглядит примерно так:

public static bool ==(Foo left, Foo right)
{
    if (ReferenceEquals(left, right))
    {
        return true;
    }
    if (ReferenceEquals(left, null))
    {
        return false;
    }
    // Equals should be overridden, and should be handling the case where
    // right is null (by checking with ReferenceEquals too). Also consider
    // implementing IEquatable<Foo>
    return left.Equals(right);
}

Вот Object.ReferenceEquals используется для сравнения эталонных идентификаторов. Вы могли бы использовать это снаружи (в коде, который вы в настоящее время рассматриваете изменения), но это было бы чище, просто сделать == вести себя правильно.

Вам либо нужно привести к объекту,

(object)obj == null

или использовать object.ReferenceEquals(obj, null);(объект не является хорошим именем для объекта)

Как вы обнаружили, переопределение оператора == имеет неочевидные побочные эффекты и, как правило, его следует избегать.

Вы можете рассмотреть возможность реализации в вашем объекте IComparable, а затем вызвать CompareTo вместо ==.

Вы должны проверить на null в своей реализации переопределения ==, следуя этим рекомендациям, например: http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx

Вы также можете использовать

object.ReferenceEquals(myInstance, null);

Обратите внимание, что переопределение базовых операторов, таких как ==, и / или прямое переопределение базовых типов.Net, таких как Словарь, не очень хорошая практика.

используйте оператор is null из С # 7

if(object is null)...

Другие вопросы по тегам