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