代码改变世界

C#判断对象相等的陷阱

2011-11-02 11:22  slmk  阅读(2124)  评论(13编辑  收藏  举报

请看下面的测试代码:

object a = 11;
object b = 11;

Console.WriteLine(a == b); //输出false            

实际开发过程中,可能不会这么直观,例如如下场景,我们要查找Datarow中的字段是否相等,你可能会这样写:

DataRow hbrow = needAddRows.Where(p => p["dh"] == dr["dh"]).FirstOrDefault(); //dr is a datarow

那么,恭喜你!你中奖了!:) hbrow永远是null。因为p["dh"] 和 dr[“dh"]都是object类型。但郁闷的是如果你输出:

?p["dh"].GetType().Name  //输出Int32

这就是所谓的Object对值类型ValueType的装箱与拆箱造成的

看看下面的测试代码就一目了然了:

object a = 11;
object b = 11;

Console.WriteLine(a == b); //相当于ReferenceEquals,比较引用当然不相等了!
Console.WriteLine(object.ReferenceEquals(a, b)); //false

Console.WriteLine(object.Equals(a, b)); //true
Console.WriteLine(a.Equals(b)); //true


对于比较Datarow还是用equals吧!

 

 

Silverlight打印全套解决方案--支持打印预览、页面设置(横向纵向,页边距,纸张大小、字体大小)、自动分页和多页连续打印