Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在VisualStudio中自动生成equals和hashcode方法_C#_.net_Visual Studio_List - Fatal编程技术网

C# 有没有一种方法可以在VisualStudio中自动生成equals和hashcode方法

C# 有没有一种方法可以在VisualStudio中自动生成equals和hashcode方法,c#,.net,visual-studio,list,C#,.net,Visual Studio,List,在Java中,当您希望通过remove()方法从泛型集合中正确删除对象时,您必须实现可在Eclipse中自动生成的equals(object o)和remove()方法。该方法的示例如下--->所示 如何在C#(Visual Studio,我在VS2013上)中自动生成该方法 也许没有必要让List.Remove()方法正常工作 如果无法自动执行,则引用Equals方法应该是什么样子?我是说它应该是什么样子 IsEquals()方法甚至在列表中使用。Remove()如果是,您能告诉我如果我们比较

在Java中,当您希望通过
remove()
方法从泛型
集合中正确删除对象时,您必须实现可在Eclipse中自动生成的
equals(object o)
remove()
方法。该方法的示例如下--->所示

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

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

  • 如果无法自动执行,则引用
    Equals
    方法应该是什么样子?我是说它应该是什么样子

  • Is
    Equals()
    方法甚至在
    列表中使用。Remove()
    如果是,您能告诉我如果我们比较相同的对象(内存中的相同地址),应该如何实现
    Equals()
    以返回true吗


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

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

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

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

    下面是一个简单的例子:

    class Address : MemberwiseEquatable<Address>
    {
      public Address(string street, string city)
      {
        Street = street;
        City = city;
      }
    
      public string Street { get; }
      public string City { get; }
    }
    
    这是使用eq最简单的方法:只需从
    memberwisequalable
    继承即可。请注意,如果您不能/不想从基类继承,还有其他可能性

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


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

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

  • 在要将其添加到的类中,键入等于

  • 把你的光标移到等号的末尾,点击tab键。

  • 删除NotImplementedException并添加一些相等性测试


  • 我希望这对某人有帮助

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

    只需按ctrl+。或者在类中单击鼠标右键,选择“快速操作”,然后“生成Equals和GetHashCode

    该功能的文档:

    公共类Foo
    {
    公共条{get;set;}
    公共字符串FooBar{get;set;}
    公共覆盖布尔等于(对象对象对象)
    {
    var foo=对象作为foo;
    返回foo!=null&&
    EqualityComparer.Default.Equals(Bar,foo.Bar)&&
    FooBar==foo.FooBar;
    }
    公共覆盖int GetHashCode()
    {
    var hashCode=181846194;
    hashCode=hashCode*-1521134295+EqualityComparer.Default.GetHashCode(Bar);
    hashCode=hashCode*-1521134295+EqualityComparer.Default.GetHashCode(FooBar);
    返回哈希码;
    }
    }
    

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

    EqualityComparer<IList<Foo>>.Default.Equals(SomeFoos, other.SomeFoos);
    
    EqualityComparer.Default.Equals(SomeFoos,other.SomeFoos);
    
    天哪,有人吗?
    ReSharper也能做到这一点。

    你说的“自动”是什么意思?即使eclipse也不知道您希望如何实现这些方法,所以自定义对象的相等性意味着什么。如果您只想创建方法体,请让您的类实现
    IEqualityComparer
    。如果单击界面下方的红色错误行,VisualStudio将建议自动创建它们。但它们将只包含
    抛出新的NotImplementedException()
    @TimSchmelter它确实知道,上面的例子。那么eclipse将类的所有属性添加到
    Equals
    GetHashCode
    中,还是只添加一个属性,还是不添加?上面自动生成的是什么
    Equals
    GethashCode
    对于复杂的对象来说并不简单。@TimSchmelter Is
    Equals()
    方法甚至在
    列表中使用。Remove()
    如果是,您能告诉我如果我们比较相同的对象(内存中的相同地址),应该如何实现
    Equals()
    Equals
    用于和通过引用比较两个对象使用:
    Object.ReferenceEquals(obj1,obj2)
    。首先阅读文档总是值得的。您可以在备注部分找到相关信息。看起来VS for Mac Community Edition也有此选项,但在
    new Address("Baker Street", "London") == new Address("Baker Street", "London")
    
        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;
        }
    
    }
    
    EqualityComparer<IList<Foo>>.Default.Equals(SomeFoos, other.SomeFoos);