您的位置:首页 > 其它

对象的比较与排序(四):对象的相等判断Equals和IEquatable<T>

2012-02-03 16:50 429 查看
本节覆盖了以下知识点:

一、Object.Equals()方法;

二、“==”,“!=”运算符重载;

三、IEquatable<T> 接口。

一、重写Equals方法。

众所周知,Object类型有一个名为Equals的实例方法可以用来确定两个对象是否相等。Object的Equals的默认实现比较的是两个对象的引用等同性。而Object的派生类ValueTpye重写了Equals方法,它比较的是两个对象的逻辑等同性。也就是说,在C#里,引用类型的默认Equals版本关注的是引用等同性,而值类型关注的是逻辑等同性。当然,这并不总能满足我们的要求。所以每当我们更在意引用类型的逻辑等同性的时候,我们就应该重写Equals方法。

上一个日记通过实现IComparable<T>接口的对象可以相互比较,但比较结果是0,1和-1,显得不直观,在许多情况下,可能只需要知道两个对象是否相等,而不需要知道这两个对象

“谁大谁小”,这时,可以重写object类的 Equals方法。

public override bool Equal(object obj)

{

if(this.CompareTo(obj)==0)

return true;

else

return false;

}


可以看到,Equals方法的内部调用CompareTo方法进行对象比较。

总结:

C#中有两种不同的相等:引用相等和值相等。值相等,即两个对象包含相同的值。例如,两个值为2的整数数具有值相等性。引用相等意味着要比较的两个对象不是两个对象,而是两个“对象引用”,这两个“对象引用”引用的是同一个对象。
1、对于值类型
  对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。
2、对于引用类型
  对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
  ==操作比较的是两个变量的值是否相等。
  equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。
  首先我们看一段程序:

测试代码

using System;
using System.Collections.Generic;
using System.Text;

namespace ObjectCompare
{
class Program
{
static void Main(string[] args)
{
Circle obj1 = new Circle { Radius = 100.1 };
Circle obj2 = new Circle { Radius = 100.9 };
//测试覆盖的方法
Console.WriteLine(obj1.GetHashCode());//100100
Console.WriteLine(obj2.GetHashCode());//100900
Console.WriteLine(obj1.CompareTo(obj2)); //-1
Console.WriteLine(obj1.Equals(obj2));//false
//测试重载的运算符
Console.WriteLine(obj1 == obj2);    //false
Console.WriteLine(obj1 != obj2);    //true
Console.WriteLine(obj1 >= obj2);    //false

//以下测试Circle对象数组的排序功能
Circle[] circles = new Circle[10];  //创建Circle对象数组
Random ran = new Random();
for (int i = 0; i < 10; i++)
{
circles[i] = new Circle { Radius = ran.Next(1, 1000)/100.0 };
}
Console.WriteLine("原始数组:");
Array.ForEach<Circle>(circles, (circle) => { Console.WriteLine("圆对象的哈希代码:{0},半径:{1}", circle.GetHashCode(), circle.Radius); });
Console.WriteLine("\n排序之后:");
Array.Sort(circles);
Array.ForEach<Circle>(circles, (circle) => { Console.WriteLine("圆对象的哈希代码:{0},半径:{1}", circle.GetHashCode(), circle.Radius); });

Console.ReadKey();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐