欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

C#中相等性与同一性的区别

创建时间:2012年11月20日 14:30  阅读次数:(5284)
分享到:

相等与同一


CLR (像许多其他技术一样)区别对象的相等与同一。这对于引用类型(例如类)尤其重要。一般来说,如果两个对象是相同类型的实例,并且其中一个对象的各个字段匹配另一个对象的字段值,那么这两个对象就是相等的(equivalent)。但这并不意味着它们是“同一”个对象,只是这两个对象有相同的值而己。相比之下,如果两个对象在内存中共事一个地址,则它们便是同一的( identical)。在实践中,如果两个引用都指向同一个对象,那么,它们就是同一的。

比较对象引用的同一性相对简单一些,只需要对内存地址进行比较,而与类型无关。你可以通过System.ObjectReferenceEquals静态方法执行这种测试。该方法简单地对包含在两个对象引用中的地址进行比较,与相关对象的类型没有关系。

不像同一性比较那样,相等性的比较则是类型相关的。正是这个原因,System.Object提供了一个Equals虚方法,用于比较任意两个对象的相等性(示例5.4)。如图5.8和示例(5.5 所示,只有两个对象具有相等的值时,Equals方法才返回真。而对于System.Object.ReferenceEquals方法而言,只有当引用指向同一个对象时,它才返回真。

示例5.4
System.Ohject{
Namespace System{
Public class Object{
//同一性测试
Public static bool ReferenceEquals(Object a,Object b);

//相等性测试
Public virtual bool Equals(Object rbs);

//相等性测试
public virtual int GetHashCode();
protected object MemberwiseClone();
protected virtual void Finalize();

//为了清楚起见,这里省略了ToString()和GetType方法

}

示例5.5 测试同一性和相等性
class Util{
static void Main()
{
object o1=new person();
object o2=new person();

Debug.Assert(Object.ReferenceEquals(o1,o2)==false);
bool whoknows=o1.Equals(o2);//无法预期
o1=o2;
Debug.Assert(Object.ReferenceEquals(o1,o2)==true);
Debug.Assert(o1.Equals(o2)==true)
}
}



Object.Equals的实现需要保证这个运算具有自反性,对称性和传递性也就是说在给定任何类型的一个实例时,下面的断言总是为真:
public sealed class Utils{
public static void AssertReflexive(Object o)
{
if (o!=null)
{
Debug.Assert(o.Equals(0));
}
}
}

同样,Equals的实现必须是对称的:
public sealed class Utils{
public static void AssertSymmetric(object o1,object o2){
if (o1=null&&o2!=null)
{
Debug.Assert(o1.Equals(o2)==o2.Equals(o1));
}
}
}

最后,Equals的实现在相等性上必须具有传递性
public sealed class Utils{
publicstatic void AssertTransitive(object o1,object o2,object o3)
{
if (o1!=null&&o2!=null&&o3!=null)
{
if(o1.Equals(o2)&&o2.Equals(o3))
{
Debug.Assert(o1.Equals(o3));
}
}
}
}

每个类型都能对System.Object.Equals方法实现自己的版本,如示例5.6所示。对于引用类型而言,Objcct.Equals的默认实现只是简单地测试同一性,这意味着只有当两个对象实际上是同一个对象时该方法才会返回真。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 49+56=? 的结果(结果是:105)
结  果: