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

时间:2014-01-08 12:34:41

标签: c# .net visual-studio list

在Java中,如果要通过Collection方法从通用remove()中正确删除对象,则必须实现equals(Object o)remove()方法,该方法可以自动生成日食。该方法的示例看起来像--->下方。

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

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

  3. 如果参考Equals方法看起来不应该是什么样子?我的意思是它应该是什么样子。

  4. Equals()中是否使用了List.Remove()方法,如果可以的话,如果我们比较同一个对象(同一地址),你能告诉我Equals()应如何实现以返回true在记忆中)


  5.   @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;
        }
    

4 个答案:

答案 0 :(得分:11)

在设计时自动生成Equals()

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

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

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

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

这是一个简单的例子:

class Address : MemberwiseEquatable<Address>
{
  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")

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

备注比较按值按引用进行比较

在上一个问题中,您想知道如何编写Equals方法,通过&#34;内存中的地址来比较对象&#34;。这称为引用相等性比较,是每个类从Equals()继承的默认object实现。因此,要在课堂上获得参考平等,只需不要覆盖Equals()

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

答案 1 :(得分:9)

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

只需按 ctrl + 或在课程中右键单击并选择“快速操作”,然后选择“生成等于和GetHashCode ”< / p>

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

∃d(P(d))

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

    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<Bar>.Default.Equals(Bar, foo.Bar) &&
               FooBar == foo.FooBar;
    }

    public override int GetHashCode()
    {
        var hashCode = 181846194;
        hashCode = hashCode * -1521134295 + EqualityComparer<Bar>.Default.GetHashCode(Bar);
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(FooBar);
        return hashCode;
    }

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

答案 2 :(得分:5)

没有。 ReSharper可以做到这一点(以及其他好东西,例如实施IEquatable<T>),但普通的VS不能。

答案 3 :(得分:4)

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

  1. 在要添加它们的类中,键入Equals enter image description here

  2. 将你的光标带到Equals的末尾并点击标签。 enter image description here

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

  4. 我希望这对某人有帮助!