Alb*_*ada 9 c# class equals object
如果我有一个像这样的对象:
public class Person
{
public int id {get;set;}
public string name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想要的行为:
Person a = new Person();
Person b = new Person();
a == b;
Run Code Online (Sandbox Code Playgroud)
并且a == b返回true,我是否必须覆盖Object.Equals()方法?或者是否有其他方法可以不覆盖Equals方法?
编辑
我想比较数据,因为我想知道我调用的外部方法是否返回一个新对象或一个具有不同于新对象的数据的对象
Abb*_*bas 20
有几种方法可以做到这一点.默认情况下,Equals()并==检查是否有参考平等,意思是:
Person a = new Person();
Person b = a:
a.Equals(b); //true
a == b; //true
Run Code Online (Sandbox Code Playgroud)
因此,不会将对象与值相等进行比较,这意味着:
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
a.Equals(b); //false
a == b; //false
Run Code Online (Sandbox Code Playgroud)
要比较对象的值,可以覆盖Equals()和GetHashcode()方法,如下所示:
public override bool Equals(System.Object obj)
{
if (obj == null)
return false;
Person p = obj as Person;
if ((System.Object)p == null)
return false;
return (id == p.id) && (name == p.name);
}
public bool Equals(Person p)
{
if ((object)p == null)
return false;
return (id == p.id) && (name == p.name);
}
public override int GetHashCode()
{
return id.GetHashCode() ^ name.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
现在,您将在比较时看到其他结果:
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;
a == b; //false
a == c; //true
a.Equals(b); //true
a.Equals(c); //true
Run Code Online (Sandbox Code Playgroud)
该==运营商不被覆盖,因此仍然没有参考比较.这可以通过重载它以及!=运算符来解决:
public static bool operator ==(Person a, Person b)
{
if (System.Object.ReferenceEquals(a, b))
return true;
if ((object)a == null || (object)b == null)
return false;
return a.id == b.id && a.name == b.name;
}
public static bool operator !=(Person a, Person b)
{
return !(a == b);
}
Run Code Online (Sandbox Code Playgroud)
现在运行检查结果如下:
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;
a == b; //true
a == c; //true
a.Equals(b); //true
a.Equals(c); //true
Run Code Online (Sandbox Code Playgroud)
更多阅读:
| 归档时间: |
|
| 查看次数: |
15904 次 |
| 最近记录: |