请问在VS2003中调试时如何判断两个引用是指向同一个对象还是指向两个内容相同的对象?

时间:2021-12-02 19:55:00
我在VS2003中调试程序时遇到一个问题,我使用NHibernate自动持久化我自己的业务类,由于很多对象是由NHibernate自动创建的,我不太清楚有些引用的指向。
    请问如何在调试时判断两个引用是指向同一个对象还是指向两个内容相同的对象?如果能像C++的指针一样在变量监视窗口中能直接看到引用的值(类似指针指向的地址)就好了。

8 个解决方案

#1


Object.Equals 方法

确定两个 Object 实例是否相等。

#2


引用类型的变量
用Equals方法的时候
会判断是否同一个引用

#3


Equals方法是判断两个对象的数据是否相等,判断是否是同一个引用应该使用==运算符。
你好像误会了我的意思,我是说在调试时在编译器中怎样能方便的看到各个引用指向的对象实例,而不是在编程时用语句判断。

#4


这么简单的问题竟然都没有人回答吗:(

#5


什么时候应该使用 ==?什么时候应该使用 Equals?(转 原作:Jon Skeet)
Equals 方法只是在 System.Object 中定义的一个虚拟方法,它由任何选择执行该任务的类所重写。== 运算符是一个可由类重载的运算符,该类通常具有恒等行为。

对于未重载 == 的引用类型,该运算符会比较两个引用类型是否引用同一对象,而这恰好是 System.Object 中的 Equals 实现所做的工作。

对于未重载 == 的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。当您对值类型调用 Equals 时,仍然会发生这一情况,但这一次,该实现是由 ValueType 提供的,并且使用反射进行比较,从而使比较速度比特定于类型的实现慢很多。

到此为止,二者是如此类似。二者之间的主要区别是多态。运算符被重载而不是被重写,这意味着除非编译器知道调用更为具体的版本,否则它只是调用恒等版本。为阐明这一点,请看下面这个示例:

using System;
public class Test
{
static void Main()
{
        // Create two equal but distinct strings
        string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
        string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
        Console.WriteLine (a==b);
        Console.WriteLine (a.Equals(b));
        // Now let's see what happens with the same tests but
        // with variables of type object
        object c = a;
        object d = b;
        Console.WriteLine (c==d);
        Console.WriteLine (c.Equals(d));
    }
}

结果是:

True
True
False
True

第三行是 False,原因在于编译器不知道 c 和 d 的内容都是字符串引用,因而只能调用 == 的非重载版本。因为它们是对不同字符串的引用,所以恒等运算符返回 False。

那么,应该如何区别使用这些运算符呢?我的准则是:对于几乎所有引用类型,当您希望测试相等性而不是引用一致性时,请使用 Equals。例外的情况是字符串 - 使用 == 比较字符串确实会使事情简单得多,而且代码可读性更好,但是 您需要记住,该运算符的两端都必须是类型字符串表达式,才能使比较正常进行。

对于值类型,我通常使用 ==,因为除非值类型本身包含引用类型(这种情况极为罕见),否则是恒等还是相等的问题无关紧要。

#6


Object.Equals 方法

#7


两个对象指向同一个引用应该是==
两个对象是否内容一致应该是Equals,好像总是需要你重载这个方法来判断具体是否一致~

#8


在程序里应该用Object.ReferenceEquals判断两个引用是否指向同一个对象。

在调试时候,可以在command窗口(Ctrl-Alt-A)输入:
           (Object)A==(Object)B (回车)

输出true表示A和B指向同一个对象。

#1


Object.Equals 方法

确定两个 Object 实例是否相等。

#2


引用类型的变量
用Equals方法的时候
会判断是否同一个引用

#3


Equals方法是判断两个对象的数据是否相等,判断是否是同一个引用应该使用==运算符。
你好像误会了我的意思,我是说在调试时在编译器中怎样能方便的看到各个引用指向的对象实例,而不是在编程时用语句判断。

#4


这么简单的问题竟然都没有人回答吗:(

#5


什么时候应该使用 ==?什么时候应该使用 Equals?(转 原作:Jon Skeet)
Equals 方法只是在 System.Object 中定义的一个虚拟方法,它由任何选择执行该任务的类所重写。== 运算符是一个可由类重载的运算符,该类通常具有恒等行为。

对于未重载 == 的引用类型,该运算符会比较两个引用类型是否引用同一对象,而这恰好是 System.Object 中的 Equals 实现所做的工作。

对于未重载 == 的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。当您对值类型调用 Equals 时,仍然会发生这一情况,但这一次,该实现是由 ValueType 提供的,并且使用反射进行比较,从而使比较速度比特定于类型的实现慢很多。

到此为止,二者是如此类似。二者之间的主要区别是多态。运算符被重载而不是被重写,这意味着除非编译器知道调用更为具体的版本,否则它只是调用恒等版本。为阐明这一点,请看下面这个示例:

using System;
public class Test
{
static void Main()
{
        // Create two equal but distinct strings
        string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
        string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
        Console.WriteLine (a==b);
        Console.WriteLine (a.Equals(b));
        // Now let's see what happens with the same tests but
        // with variables of type object
        object c = a;
        object d = b;
        Console.WriteLine (c==d);
        Console.WriteLine (c.Equals(d));
    }
}

结果是:

True
True
False
True

第三行是 False,原因在于编译器不知道 c 和 d 的内容都是字符串引用,因而只能调用 == 的非重载版本。因为它们是对不同字符串的引用,所以恒等运算符返回 False。

那么,应该如何区别使用这些运算符呢?我的准则是:对于几乎所有引用类型,当您希望测试相等性而不是引用一致性时,请使用 Equals。例外的情况是字符串 - 使用 == 比较字符串确实会使事情简单得多,而且代码可读性更好,但是 您需要记住,该运算符的两端都必须是类型字符串表达式,才能使比较正常进行。

对于值类型,我通常使用 ==,因为除非值类型本身包含引用类型(这种情况极为罕见),否则是恒等还是相等的问题无关紧要。

#6


Object.Equals 方法

#7


两个对象指向同一个引用应该是==
两个对象是否内容一致应该是Equals,好像总是需要你重载这个方法来判断具体是否一致~

#8


在程序里应该用Object.ReferenceEquals判断两个引用是否指向同一个对象。

在调试时候,可以在command窗口(Ctrl-Alt-A)输入:
           (Object)A==(Object)B (回车)

输出true表示A和B指向同一个对象。