在我的程序中,我有从Dictionary派生的对象。我需要检查两个对象是否相等,所以我做了一个重载运算符==。
但稍后,我需要检查对象是否为空。
If (object == null)
{...}
所以在这一点上,程序进入我定义的重载操作,但会抛出NullReferenceException,因为要比较的其中一个对象是null。
因此在重载操作中,我需要检查一个对象是否为null,但不使用==,因为这会给我一个StackOverflowException。
我该怎么检查?
答案 0 :(得分:11)
在我的程序中,我有来自Dictionary的对象。
我首先会强烈重新考虑来自Dictionary
。这很少是一个好主意。总的来说,喜欢组合而不是继承,并且仔细考虑非常关于你希望平等(和哈希码)在可变数据面前表现的方式。如果两个物体在一个点上相等然后在之后不相等,那通常是一个不好的迹象。
所以在这一点上,程序进入我定义的重载操作,但会抛出NullReferenceException,因为要比较的其中一个对象是null。
那是问题。您的重载==
运算符应该不抛出异常 - 它应该将值与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
用于执行参考标识比较。您可以在外部使用此功能(在您当前正在考虑更改的代码中),但只有让==
正常运行才会更清晰。
答案 1 :(得分:4)
您需要转换为对象,
(object)obj == null
或使用object.ReferenceEquals(obj, null);
(对象不是对象的好名称)
答案 2 :(得分:0)
您必须在执行overriden ==时检查null,遵循以下准则: http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx
您也可以使用
object.ReferenceEquals(myInstance, null);
请注意,覆盖基本运算符(如==和/或直接覆盖.Net基类型,如Dictionary)都不是很好的做法。
答案 3 :(得分:0)
覆盖==运算符具有非明显的副作用,通常应该避免。
您可以考虑让对象实现IComparable,然后调用CompareTo而不是==。
答案 4 :(得分:0)
使用 c# 7 中的 is null 运算符
if(object is null)...