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

 jojo 发布于 2023-02-05 11:02

在Java中,当你想有remove从一个通用的正确对象Collectionremove()方法,你必须执行equals(Object o),并remove()可以在Eclipse中自动生成的方法.该方法的示例如下所示--->.

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

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

    如果不能自动地如何参考Equals方法应该是什么样子?我的意思是它应该是什么样子.

    Equals()方法,即使在使用List.Remove(),如果这样你能告诉我怎么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;
    }

theDmi.. 12

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")

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

注释按值参考进行比较

在上一个问题中,您想知道如何编写一个Equals方法,通过"内存中的地址"来比较对象.这称为引用相等比较,是Equals()每个类继承的默认实现object.因此,要在类上获得引用相等性,请不要覆盖Equals().

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

3 个回答
  • 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方法,通过"内存中的地址"来比较对象.这称为引用相等比较,是Equals()每个类继承的默认实现object.因此,要在类上获得引用相等性,请不要覆盖Equals().

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

    2023-02-05 11:03 回答
  • 瞧,自2017年11月以来,甚至Visual Studio本身也可以生成这些方法的有意义的实现(至少从版本15.5.2开始).

    只需在课程中按ctrl+ .或右键单击并选择"快速操作",然后选择" 生成等于和GetHashCode "

    该功能的文档: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<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;
        }
    
    }
    

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

    EqualityComparer<IList<Foo>>.Default.Equals(SomeFoos, other.SomeFoos);
    

    OMG有人吗?而ReSharper也是如此.

    2023-02-05 11:04 回答
  • 第ReSharper的可以做到这一点(与其他东西,如实施沿IEquatable<T>),但平淡VS不能.

    2023-02-05 11:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有