Maybe You Don't Know ! - 如何比较两个引用是否指向同一个对象?
2004-04-14 08:56
405 查看
Person p1, p2;
// ...
Console.WriteLine( p1 == p2 );
上面的代码用来判断p1和p2是否指向同一个对象,但有某种情况下,我们却不能保证其正确性,那就是当我们不能肯定Person类的定义中是否重载了“==”的时候。也许根据Person的定义,只要两个Person对象的ID属性相等,那么应用“==”就会返回true。
这个时候,我们应该:
Object o1 = p1;
Object o2 = p2;
Console.WriteLine( o1 == o2 );
Yes,当C#编译器发现“==”两边的对象的声明类型是Object(而不论他们的实际对象是什么)时,C#编译器都不会应用多态原则,调用实际类型中定义的“==”,而会将这两个对象(的引用)载入到堆栈,然后执行一个“ceq”指令,比较他们是否指向了同一个对象。
.NET为了方便我们,提供了一个静态的Object.ReferenceEquals(Object o1, Object o2)来判断参数中的两个引用是否指向同一个对象,它的实现是:
public static bool ReferenceEquals(object o1, object o2)
{
? return ( o1 == o2 );
}
所以,我们上面的那个代码示例可以简单的写成:
Person p1, p2;
// ...
Console.WriteLine( Object.ReferenceEquals( p1, p2 ) );
// ...
Console.WriteLine( p1 == p2 );
上面的代码用来判断p1和p2是否指向同一个对象,但有某种情况下,我们却不能保证其正确性,那就是当我们不能肯定Person类的定义中是否重载了“==”的时候。也许根据Person的定义,只要两个Person对象的ID属性相等,那么应用“==”就会返回true。
这个时候,我们应该:
Object o1 = p1;
Object o2 = p2;
Console.WriteLine( o1 == o2 );
Yes,当C#编译器发现“==”两边的对象的声明类型是Object(而不论他们的实际对象是什么)时,C#编译器都不会应用多态原则,调用实际类型中定义的“==”,而会将这两个对象(的引用)载入到堆栈,然后执行一个“ceq”指令,比较他们是否指向了同一个对象。
.NET为了方便我们,提供了一个静态的Object.ReferenceEquals(Object o1, Object o2)来判断参数中的两个引用是否指向同一个对象,它的实现是:
public static bool ReferenceEquals(object o1, object o2)
{
? return ( o1 == o2 );
}
所以,我们上面的那个代码示例可以简单的写成:
Person p1, p2;
// ...
Console.WriteLine( Object.ReferenceEquals( p1, p2 ) );
相关文章推荐
- 如何比较两个引用是否指向同一个对象?
- C# 比较两个路径是否指向同一对象
- LeetCode Javascript实现 169. Majority Element 217. Contains Duplicate(两个对象比较是否相等时,如果都指向同一个对象,a==b才是true)350. Intersection of Two Arrays II
- 【OC学习-15】如何判断两个对象是否属于同一个类?如何判断一个对象是否属于某一个类?
- JS中如何比较两个Json对象是否相等
- JS中如何比较两个Json对象是否相等实例代码
- 一种排序--引发:java两个引用指向同一个对象
- 两个引用指向同一个对象的内存图
- 如何理解父类引用指向子类对象
- Java中比较两个对象是否相同
- 如何比较这两个字符串是否相等?
- Javascript如何比较两个Object/Array的值是否相等
- 比较两个对象是否相等
- 如何判断两个jq对象是同一个对象
- 详解JS 比较两个Json对象的值是否相等的实例
- 如何判断两个对象是否一致
- 探讨:反射法比较两个对象的属性值是否相同 [ 光影人像 东海陈光剑 的博客 ]
- 比较两个对象是否相等
- java多态,如何理解父类引用指向子类对象
- 如何比较两个二维数组是否相等 - 回复 "阿拉丁" 的问题