C#判断对象相等的陷阱
2011-11-02 11:22 slmk 阅读(2124) 评论(13) 编辑 收藏 举报请看下面的测试代码:
object a = 11;
object b = 11;
Console.WriteLine(a == b); //输出false
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吧!