gpt4 book ai didi

c# - 有完整的IEquatable实现引用吗?

转载 作者:IT王子 更新时间:2023-10-29 03:53:21 26 4
gpt4 key购买 nike

我在 SO 上的许多问题都与 IEquatable 实现有关。我发现它很难正确实现,因为在天真的实现中有很多隐藏的错误,而且我找到的关于它的文章也很不完整。我想找到或写一个明确的引用,其中必须包括:

  • 如何正确实现IEquatable
  • 如何正确覆盖 Equals
  • 如何正确覆盖GetHashCode
  • 如何正确实现ToString方法
  • 如何正确实现运算符==
  • 如何正确实现运算符!=

这样完整的引用文献已经存在了吗?

附言:偶MSDN reference对我来说似乎有缺陷

最佳答案

实现IEquatable<T>对于值类型

实现 IEquatable<T>值类型与引用类型略有不同。假设我们有 Implement-Your-Own-Value-Type 原型(prototype),一个复数结构。

public struct Complex
{
public double RealPart { get; set; }
public double ImaginaryPart { get; set; }
}

我们的第一步是实现 IEquatable<T>并覆盖 Object.EqualsObject.GetHashCode :

public bool Equals(Complex other)
{
// Complex is a value type, thus we don't have to check for null
// if (other == null) return false;

return (this.RealPart == other.RealPart)
&& (this.ImaginaryPart == other.ImaginaryPart);
}

public override bool Equals(object other)
{
// other could be a reference type, the is operator will return false if null
if (other is Complex)
return this.Equals((Complex)other);
else
return false;
}

public override int GetHashCode()
{
return this.RealPart.GetHashCode() ^ this.ImaginaryPart.GetHashCode();
}

除了运算符之外,我们只需要很少的努力就可以实现正确的实现。添加运算符也是一个简单的过程:

public static bool operator ==(Complex term1, Complex term2)
{
return term1.Equals(term2);
}

public static bool operator !=(Complex term1, Complex term2)
{
return !term1.Equals(term2);
}

精明的读者会注意到我们应该实现 IEquatable<double>Complex数字可以与基础值类型互换。

public bool Equals(double otherReal)
{
return (this.RealPart == otherReal) && (this.ImaginaryPart == 0.0);
}

public override bool Equals(object other)
{
// other could be a reference type, thus we check for null
if (other == null) return base.Equals(other);

if (other is Complex)
{
return this.Equals((Complex)other);
}
else if (other is double)
{
return this.Equals((double)other);
}
else
{
return false;
}
}

如果我们添加IEquatable<double>,我们需要四个运算符,因为你可以有 Complex == doubledouble == Complex (对于 operator != 也是如此):

public static bool operator ==(Complex term1, double term2)
{
return term1.Equals(term2);
}

public static bool operator ==(double term1, Complex term2)
{
return term2.Equals(term1);
}

public static bool operator !=(Complex term1, double term2)
{
return !term1.Equals(term2);
}

public static bool operator !=(double term1, Complex term2)
{
return !term2.Equals(term1);
}

至此,我们以最小的努力得到了正确且有用的实现 IEquatable<T>对于值类型:

public struct Complex : IEquatable<Complex>, IEquatable<double>
{
}

关于c# - 有完整的IEquatable实现引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com