c# 复写Equals方法

本文探讨了在编程中如何复写Object.Equals和GetHashCode方法来实现基于属性的相等比较,而非依赖对象引用。通过示例代码展示了在List.Remove操作中如何根据特定属性(如身份证ID)判断两个对象是否相等。同时强调,当重写Equals时,务必同步更新GetHashCode,以确保相等的对象具有相同的HashCode,避免在Dictionary等数据结构中引发问题。

应用情景:

很多标准的方法都是利用Object.Equals方法来做对比的,例如LIst.Remove

假设 某些情景下我们希望引用类型判断“相等”时不去看地址是不是同一个,而是看某些属性是不是一样就可以了。(例如身份证ID是一个就认为是同一个人)

复写方法如下范例所示:

Main{
    List<People> nList = new List<People> { new People( 1 ), new People( 2 ), new People( 3 ) };
	People onePeople = new People( 1 );
	nList.Remove( onePeople );

}


class People
{
	public People( int nID )
	{
		ID = nID;
	}
	int ID;

	public override bool Equals( object obj )
	{
		return Equals( obj as People );
	}

	bool Equals( People other )
	{
		return other != null 
			&& ID == other.ID;
	}

}

P.s. 最好也重新overide GetHashCode方法:

(7跟13只是常用的手法,拿質數來乘,確保hash code是獨一無二),也可以加入 ^ 计算

public override int GetHashCode()
{
    int hash =13;
    hash = (hash * 7) + ID== null ? 0 : ID.GetHashCode();
}

原因是:

1.Equal是判断是否指向同一个地址
2.每个对象都会有一个独一无二的HashCode
一旦override了Equal方法,却不override GetHashCode方法会导致两个判断为相同(利用Equal判断)的对象,Hash值却不同。
承上,在使用到HashCode的地方(例如Dictionary中的key),两个相同对象可能会被重复加入到Dictionary中

### Equals 方法详解 在 C# 中,`Equals` 方法是 `Object` 类的一个虚方法,用于比较两个对象是否相等。默认情况下,`Equals` 方法比较的是对象的引用,即判断两个对象是否指向同一个内存地址。然而,`Equals` 方法可以被重写以实现基于值的比较。 #### 使用方法 `Equals` 方法的基本用法如下: ```csharp object obj1 = new object(); object obj2 = new object(); bool result = obj1.Equals(obj2); // 比较 obj1 和 obj2 是否相等 ``` 对于字符串等类型,`Equals` 方法已经被重写以比较内容,而不是引用。 ```csharp string str1 = "hello"; string str2 = "hello"; bool result = str1.Equals(str2); // 比较 str1 和 str2 的内容是否相等 ``` #### 重写 Equals 方法 为了实现基于值的比较,通常需要重写 `Equals` 方法。下面是一个重写 `Equals` 方法的例子: ```csharp public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) { return false; } Point p = (Point)obj; return (x == p.x) && (y == p.y); } public override int GetHashCode() { return x ^ y; } } ``` 在这个例子中,`Equals` 方法被重写以比较 `Point` 对象的 `x` 和 `y` 属性是否相等。同时,`GetHashCode` 方法也被重写,以确保当两个对象相等时,它们的哈希码也相等。 #### ReferenceEquals 方法 `ReferenceEquals` 方法用于比较两个对象的引用是否相同,即它们是否指向同一个内存地址。 ```csharp object obj1 = new object(); object obj2 = new object(); bool result = Object.ReferenceEquals(obj1, obj2); // 比较 obj1 和 obj2 的引用是否相同 ``` 即使两个对象的内容相同,如果它们是不同的实例,`ReferenceEquals` 方法将返回 `false` [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值