C# 使用Equals()重写相等运算符
我已经调试一个问题很长时间了,并且意识到它来自于在我应该使用C# 使用Equals()重写相等运算符,c#,operators,overriding,equality,C#,Operators,Overriding,Equality,我已经调试一个问题很长时间了,并且意识到它来自于在我应该使用对象的对象上使用=。Equals() 为了防止此类问题,希望=操作符调用我已重写的对象.Equals() 可能吗?以下代码遇到堆栈溢出异常 public static bool operator ==(Portfolio a, Portfolio b) { return a != null && a.Equals(b); } public static bool operator !=(Portfolio a,
对象的对象上使用=
。Equals()
为了防止此类问题,希望=
操作符调用我已重写的对象.Equals()
可能吗?以下代码遇到堆栈溢出异常
public static bool operator ==(Portfolio a, Portfolio b)
{
return a != null && a.Equals(b);
}
public static bool operator !=(Portfolio a, Portfolio b)
{
return a != null && !a.Equals(b);
}
谢谢 您正在递归调用
=您的中的code>运算符=代码>运算符,因此堆栈溢出。改用ReferenceEquals
:
public static bool operator !=(Portfolio a, Portfolio b)
{
return !object.ReferenceEquals(a, null) && !a.Equals(b);
}
这就是说,此代码有缺陷,因为如果a
为null而b
为null,它将返回false
。您应该检查这两个对象是否为空:
public static bool operator !=(Portfolio a, Portfolio b)
{
if (object.ReferenceEquals(a, null))
{
return !object.ReferenceEquals(b, null);
}
return !a.Equals(b);
}
您正在递归调用=您的中的code>运算符=代码>运算符,因此堆栈溢出。改用ReferenceEquals
:
public static bool operator !=(Portfolio a, Portfolio b)
{
return !object.ReferenceEquals(a, null) && !a.Equals(b);
}
这就是说,此代码有缺陷,因为如果a
为null而b
为null,它将返回false
。您应该检查这两个对象是否为空:
public static bool operator !=(Portfolio a, Portfolio b)
{
if (object.ReferenceEquals(a, null))
{
return !object.ReferenceEquals(b, null);
}
return !a.Equals(b);
}
你的Equals
看起来怎么样?你的Equals
看起来怎么样?通常我喜欢让一个private/protected静态bool等于([type]a[type]b){if(ReferenceEquals(a,b)){return true;}if(ReferenceEquals(a,null)| ReferenceEquals(b,null)){return false;}/*知道a和b不是空引用的逻辑*/}
然后公共重写bool Equals(object obj){返回等于(这个,obj作为[type]);}
和公共静态bool操作符==([type]a,[type]b){return Equals(a,b);}
和公共静态bool操作符=([type]a[type]b){return!Equals(a,b);}
如果类型应该是可比较的,我会使用这种方法:Hi。谢谢实际上在同一时间提出了相同的解决方案:)通常我喜欢使一个私有/受保护的静态bool等于([type]a,[type]b){if(ReferenceEquals(a,b)){return true;}if(ReferenceEquals(a,null)| ReferenceEquals(b,null)){return false;}/*知道a和b不是null引用的逻辑*/}
然后公共重写bool Equals(object obj){return Equals(这个,obj作为[type]);}
和公共静态bool操作符==([type]a[type]b){return Equals(a,b);}
和公共静态bool操作符=([type]a[type]b){return!Equals(a,b);}
如果类型应该是可比较的,我会使用这种方法:Hi。谢谢实际上在同一时间提出了相同的解决方案:)