有没有办法在Visual Studio中自动生成equals和hashcode方法

在Java中,如果要通过remove()方法从genericsCollection中正确删除对象,则必须实现equals(Object o)remove()方法,这些方法可以在Eclipse中自动生成。 该方法的示例如下所示—>。

  1. 如何在C#中自动生成该方法(Visual Studio,我在VS2013上)?

  2. 也许没有必要使List.Remove()方法正常工作?

  3. 如果不能自动引用Equals方法的参考方式? 我的意思是它应该是什么样子。

  4. Equals()方法是否甚至在List.Remove()使用,如果可以的话,你可以告诉我如何比较同一个对象(内存中的相同地址Equals()应该如何实现Equals()以返回true


  @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((centerPanel == null) ? 0 : centerPanel.hashCode()); result = prime * result + ((lowerPanel == null) ? 0 : lowerPanel.hashCode()); return result; } @Override public boolean equals(Object obj) { if(this == obj) return true; if(obj == null) return false; if(getClass() != obj.getClass()) return false; LayoutDemo other = (LayoutDemo) obj; if(centerPanel == null) { if(other.centerPanel != null) return false; } else if(!centerPanel.equals(other.centerPanel)) return false; if(lowerPanel == null) { if(other.lowerPanel != null) return false; } else if(!lowerPanel.equals(other.lowerPanel)) return false; return true; } 

在设计时自动生成Equals()

如果你想生成一次,然后手动维护生成的源代码(例如,如果类更改),Resharper是一个有用的工具,正如@ThomasWeller在他的回答中已经提到的那样。

请注意,此方法有可能难以找到错误,因为您需要记住在更改类时调整Equals()实现。 要避免这种情况,请使用以下方法:

运行时自动生成Equals() (静态初始化时间)

如果您想要一个在运行时动态生成Equals()GetHashCode()方法的解决方案,您可以使用Equ (我是该库的作者)。 Equ在静态初始化时生成相等方法并缓存它们,因此在静态初始化之后,性能与显式实现相同。

这是一个简单的例子:

 class Address : MemberwiseEquatable
{ public Address(string street, string city) { Street = street; City = city; } public string Street { get; } public string City { get; } }

有了这个,下面的表达式是true

 new Address("Baker Street", "London") == new Address("Baker Street", "London") 

这是使用MemberwiseEquatable的最简单方法:只需从MemberwiseEquatableinheritance。 请注意,如果您不能/不想从基类inheritance,还有其他可能性。

注释按值参考进行比较

在上一个问题中,您想知道如何编写一个Equals方法,通过“内存中的地址”来比较对象。 这称为引用相等比较,是每个类从objectinheritance的默认Equals()实现。 因此,要在类上获得引用相等性,只需不要重写Equals()

但是,您应该仔细考虑要通过引用比较哪些对象,以及要按值进行比较的对象。 如果使用域驱动的设计术语,则应按值对比值对象 ,而实体应通过引用或ID进行比较。

瞧,自2017年11月起,甚至Visual Studio本身也可以生成这些方法的有意义的实现 (至少从版本15.5.2开始)。

只需按ctrl +即可 或右键单击该类并选择“快速操作”,然后选择“ 生成等于和GetHashCode

该function的文档: https : //docs.microsoft.com/en-us/visualstudio/ide/reference/generate-equals-gethashcode-methods

  public class Foo { public Bar Bar { get; set; } public string FooBar { get; set; } public override bool Equals(object obj) { var foo = obj as Foo; return foo != null && EqualityComparer.Default.Equals(Bar, foo.Bar) && FooBar == foo.FooBar; } public override int GetHashCode() { var hashCode = 181846194; hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Bar); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(FooBar); return hashCode; } } 

更新:请注意,您仍然可能不想完全信任VS并测试Equals,因为如果您的类包含Collection,则Equals将再次依赖于引用相等性,因为使用此术语:

 EqualityComparer>.Default.Equals(SomeFoos, other.SomeFoos); 

OMG有人吗? 而ReSharper也是这样做的。

不, ReSharper可以做到这一点(以及其他好东西,如实现IEquatable ),但普通的VS不能。

我知道它不是一个完整的自动生成,但在Visual Studio 2015中,有一种方法可以自动生成Hashcode()和Equals()函数的方法存根。

  1. 在要添加它们的类中,键入Equals 在此处输入图像描述

  2. 将你的光标带到Equals的末尾并点击标签。 在此处输入图像描述

  3. 删除NotImplementedExceptions并添加一些相等的测试。

我希望这对某人有帮助!