在我的程序中,我有从字典派生的对象。我需要检查两个对象是否相等,因此我重载了运算符==。
但是在后面的某个时刻,我需要检查一个对象是否为空。
If (object == null)
{...}
因此,在这一点上,程序进入我定义的过载操作,但会抛出NullReferenceException异常,因为要比较的对象之一为空。
因此,在过载操作中,我需要检查一个对象是否为空,但不能使用“==”,因为这会导致StackOverflowException异常。
我该如何检查这个问题?
在我的程序中,我有从字典派生的对象。我需要检查两个对象是否相等,因此我重载了运算符==。
但是在后面的某个时刻,我需要检查一个对象是否为空。
If (object == null)
{...}
因此,在这一点上,程序进入我定义的过载操作,但会抛出NullReferenceException异常,因为要比较的对象之一为空。
因此,在过载操作中,我需要检查一个对象是否为空,但不能使用“==”,因为这会导致StackOverflowException异常。
我该如何检查这个问题?
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);
(object不是对象的好名称)
在你实现重载的 == 中,你必须检查 null,例如可以遵循以下指南: http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx
你也可以使用
object.ReferenceEquals(myInstance, null);
重载“==”运算符,正如您所发现的那样,具有非明显的副作用,通常应该避免使用。
您可以考虑让您的对象实现IComparable接口,然后调用CompareTo而不是“==”。
使用来自C# 7的is null运算符
if(object is null)...