首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一种方法可以在Visual中自动生成等于和hashcode方法

是否有一种方法可以在Visual中自动生成等于和hashcode方法
EN

Stack Overflow用户
提问于 2014-01-08 12:34:41
回答 3查看 22.9K关注 0票数 20

在Java中,当您希望通过Collection方法从一般的remove()方法中正确地删除对象时,您必须实现equals(Object o)remove()方法,这两个方法可以在remove()中自动生成。该方法的示例如下所示-->下面。

  1. 如何在C#中自动生成该方法(Visual,我在VS2013上)?
  2. 也许没有必要让List.Remove()方法正常工作?
  3. 如果不能自动实现,那么引用Equals方法应该是什么样的呢?我是说它应该是什么样的。
  4. Equals()方法甚至在List.Remove()中使用吗?如果是的话,请告诉我,如果比较相同的对象(内存中相同的地址),Equals()应该如何实现才能返回true?
代码语言:javascript
运行
复制
  @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;
    }
EN

回答 3

Stack Overflow用户

发布于 2015-07-21 07:24:01

设计时自动生成Equals()

如果您想要生成它一次,然后手动维护生成的源代码(例如,如果类发生了变化),Resharper是一个有用的工具,@ThomasWeller在他的回答中已经提到了这一点。

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

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

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

下面是一个简单的例子:

代码语言:javascript
运行
复制
class Address : MemberwiseEquatable<Address>
{
  public Address(string street, string city)
  {
    Street = street;
    City = city;
  }

  public string Street { get; }
  public string City { get; }
}

这样,下面的表达式是true

代码语言:javascript
运行
复制
new Address("Baker Street", "London") == new Address("Baker Street", "London")

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

按值比较与参考比较的注记

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

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

票数 12
EN

Stack Overflow用户

发布于 2014-01-08 12:38:42

不是的。ReSharper可以做到这一点(以及实现IEquatable<T>之类的其他优点),但普通VS无法做到。

票数 5
EN

Stack Overflow用户

发布于 2016-02-04 20:10:47

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

  1. 在您希望将它们添加到的类中,键入等于

  1. 把你的诅咒到等号的末尾,点击标签。

  1. 删除NotImplementedExceptions并添加一些等式测试。

我希望这对某人有帮助!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20995811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档