Equals和ReferenceEquals_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Equals和ReferenceEquals

Equals和ReferenceEquals

 2013/11/6 21:10:51  wzStyle  博客园  我要评论(0)
  • 摘要:稍微分析下一下两个方法的区别:publicstaticboolEquals(objectobjA,objectobjB);publicstaticboolReferenceEquals(objectobjA,objectobjB);Q0:两者有什么区别?一般情况下区别不大,但是当publicstaticboolEquals(objectobjA,objectobjB);但是当某个类中被重写了Q:值类型的数据我们可以使用publicstaticboolEquals(objectobjA
  • 标签:

稍微分析下一下两个方法的区别:

public static bool Equals(object objA, object objB);

public static bool ReferenceEquals(object objA, object objB);

 

Q0:两者有什么区别?

    一般情况下区别不大,但是当public static bool Equals(object objA, object objB);但是当某个类中被重写了

 

Q:值类型的数据我们可以使用public static bool Equals(object objA, object objB);比较吗?

    可以,一般的值类型比如Int32,都重写了基类的 public virtual bool Equals(object obj);方法。但是更是重载了“==”这样的操作,而且不用装箱!!

 

Q1:我们想比较两个对象是否为同一个对象,我们使用哪一个呢?

    比如我们自定义了一个类A,声明类A的两个对象a1和a2.

    一般情况下我们选择ReferenceEquals比较对象相等,因为ReferenceEquals,恰如其名,就是用来比较 不同的对象 在堆上的分配的地址是否是同一块地址。

    但是我们可以使用上面的Equals吗?一般情况下也是可以的,但是如果A重写了Object的 public virtual bool Equals(object obj);我们就应该注意了! 为啥呢?

我们使用reflector查看public static bool Equals(object objA, object objB);其内部实现如下:

 

public static bool Equals(object objA, object objB)
{
    return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}

 
    当我们选用public static bool Equals(object objA, object objB);比较两个对象的时候,其调用了public virtual bool Equals(object obj);而这个方法是virtual修饰的,说明可以被重写。当类A重写了方法public virtual bool Equals(object obj);的时候,往往会出现多态现象。

    所以,public static bool Equals(object objA, object objB)比较对象 是通过重写后的public virtual bool Equals(object obj)来比较(如果该方法被派生的类重写)。而ReferenceEquals就是判断不同的对象是否在同一块堆上。

 

Q2.如何对比string s1=“123”和string s2=“123”当中s1和s2是否是同一块堆上分配的?

    如果你使用Object.Equals(s1,s2)对比的话,其实你是调用了String类的public override bool Equals(object obj)方法进行的比较,这个方法的内部我们不细究了。正确的做法是我们要使用Object.ReferenceEquals(s1,s2)进行比较。

 

Q3.自己动手重写Object的public virtual bool Equals(object obj);方法

    比如,一个类中既包含引用类型,又包含值类型,那么该类的两个对象怎么才算Equals呢?这里需要我们自定义了Equals的实现了。因为我们不自定义,而使

public static bool Equals(object objA, object objB);或者ReferenceEquals只能得出这两个对象是否在同一块堆上,这样往往不太合理。()

 

 

   

 

 

 

  • 相关文章
发表评论
用户名: 匿名