需要在结构中被覆盖,以确保平等可以正常运行呢?(What needs to be overridde

2019-07-20 08:44发布

正如标题所说:我需要重写==操作符? 如何对.Equals()方法? 什么我失踪?

Answer 1:

从MSDN的例子

public struct Complex 
{
   double re, im;
   public override bool Equals(Object obj) 
   {
      return obj is Complex && this == (Complex)obj;
   }
   public override int GetHashCode() 
   {
      return re.GetHashCode() ^ im.GetHashCode();
   }
   public static bool operator ==(Complex x, Complex y) 
   {
      return x.re == y.re && x.im == y.im;
   }
   public static bool operator !=(Complex x, Complex y) 
   {
      return !(x == y);
   }
}


Answer 2:

你也应该实现IEquatable <T>。 下面是从框架设计指南的摘录:

做值类型实现IEquatable。 上数值类型的Object.Equals方法会拳击,它的默认实现是不是很effcient,因为它使用恢复体力。 IEquatable.Equals可以提供更好的性能,并且可以实现,这样不会引起拳击。

public struct Int32 : IEquatable<Int32> {
    public bool Equals(Int32 other){ ... }
}

DO遵循相同的准则,作为实现IEquatable.Equals当重写的Object.Equals。 见8.7.1有关重写的Object.Equals详细指引



Answer 3:

Unfortunetely我没有足够的信誉发表意见的其他条目。 所以我在这里张贴有可能提高到顶部的解决方案。

纠正我,如果我错了,但是执行上述

public struct Complex 
{
   double re, im;
   public override bool Equals(Object obj) 
   {
      return obj is Complex && this == (Complex)obj;
   }
   public override int GetHashCode() 
   {
      return re.GetHashCode() ^ im.GetHashCode();
   }
   public static bool operator ==(Complex x, Complex y) 
   {
      return x.re == y.re && x.im == y.im;
   }
   public static bool operator !=(Complex x, Complex y) 
   {
      return !(x == y);
   }
}

有重大缺陷。 我指的

  public override int GetHashCode() 
   {
      return re.GetHashCode() ^ im.GetHashCode();
   }

异或是对称的,所以复合体(2,1)和复合物(1,2)将给出相同哈希码。

也许我们应该让更多的东西,如:

  public override int GetHashCode() 
   {
      return re.GetHashCode() * 17 ^ im.GetHashCode();
   }


Answer 4:

在大多数情况下,你可以避免结构实现equals和GetHashCode - 因为有一个自动执行编译器为使用逐内容+反射参考成员值类型。

看看那个帖子: 哪一个最适合的数据存储结构/类?

因此,为了便于使用,你仍然可以实现==和!=。

但大多数时候,你可以不用实现Equals和GetHashCode的。
在这里你将不得不实施情况的Equals和GetHashCode是,你不wan't考虑到现场。
例如,随着时间变化的场推移像汽车的人或instantSpeed的年龄(如果你希望把它找回来的字典在同一个地方的对象的身份不应该改变)

问候,最好的代码



Answer 5:

两个之间的基本区别在于, ==操作者是静态的,即在编译时被确定调用适当的方法中,当Equals方法dinamically调用上的一个实例。
定义既可能是最好的事情,即使这在结构的情况下,重要的少,因为结构无法扩展(一个结构不能从另一个继承)。



Answer 6:

只是为了completness我也是会建议重载Equals方法:

public bool Equals(Complex other) 
{
   return other.re == re && other.im == im;
}

这是一个真正spead改进,因为这里的输入参数的无拳击发生的历史Equals(Object obj)方法

使用值类型的一些最佳做法:

  • 使他们不变
  • 重写equals(所述一个接受一个对象作为参数);
  • 过载等于取相同的值类型的另一实例(例如*代表(复杂其他));
  • 超负荷运营商==和!=;
  • 重写GetHashCode

这来自于这个帖子: http://theburningmonk.com/2015/07/beware-of-implicit-boxing-of-value-types/



文章来源: What needs to be overridden in a struct to ensure equality operates properly?