Проверьте, является ли объект нулевым, не используя ==
В моей программе у меня есть объекты, полученные из словаря. Мне нужно проверить, равны ли 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, таких как Словарь, не очень хорошая практика.