如果我有一个这样的对象:
public class Person
{
public int id {get;set;}
public string name {get;set;}
}
我想要的是行为:
Person a = new Person();
Person b = new Person();
a == b;
并且a == b返回true,我必须重写Object.Equals()方法吗?或者,是否有其他方法可以在不重写Equals方法的情况下完成此操作?
编辑
我想要比较数据,因为我想知道我调用的外部方法是返回一个新对象,还是返回一个数据与新对象不同的对象
发布于 2013-12-20 18:34:59
您希望重载==
操作符。因此,您还应该首先覆盖Equals
。如果您覆盖Equals
,则应该始终覆盖GetHashCode
。如果重载==
操作符,还必须重载!=
操作符:
public class Person
{
public int id {get;set;}
public string name {get;set;}
public override bool Equals(object obj)
{
Person p2 = obj as Person;
if (object.ReferenceEquals(null, p2)) return false;
return id == p2.id;
}
public static bool operator ==(Person p1, Person p2)
{
if (object.ReferenceEquals(null, p1))
return object.ReferenceEquals(null, p2);
else if (object.ReferenceEquals(null, p2))
return false;
return p1.Equals(p2);
}
public static bool operator !=(Person p1, Person p2)
{
if (object.ReferenceEquals(null, p1))
return !object.ReferenceEquals(null, p2);
else if (object.ReferenceEquals(null, p2))
return true;
return !p1.Equals(p2);
}
public override int GetHashCode()
{
return id ;
}
}
现在,它比较值( id
),而不仅仅是引用:
Person p1 = new Person { id = 1, name = "Jeff" };
Person p2 = new Person { id = 2, name = "Tim" };
bool equalPersons = p1 == p2; // false
Person p3 = new Person { id = 1, name = "Jeff 2.0" }; // same id -> equal
equalPersons = p1 == p3; // true
MSDN: Guidelines for Implementing Equals and the Equality Operator (==)
发布于 2020-10-02 18:58:41
在C# 9.0及更高版本中,有一个名为record
的新类型,它的相等性是基于值的。所以你可以这样定义它:
public record Person
{
public string LastName { get; }
public string FirstName { get; }
public Person(string first, string last) => (FirstName, LastName) = (first, last);
}
然后你就可以使用
var bill1 = new Person("Bill", "Wagner");
var bill2 = new Person("Bill", "Wagner");
Console.WriteLine(bill1 == bill2); // true
参考:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#record-types
发布于 2013-12-20 18:29:17
object.Equals(object2);
在您的案例中:
a.Equals(b);
https://stackoverflow.com/questions/20701507
复制相似问题