在调试时确定不同范围内两个对象的引用相等性

时间:2017-07-07 11:04:11

标签: c#

假设我有一个引用类型class Foo { },并且我将它的实例引用传递给两个单独的方法

void Main()
{
   Foo f = new Foo();

   Bar(f);
   Baz(f);
}

void Bar(Foo f)
{
  // ...
}

void Baz(Foo f)
{
  // ...
}

在调试时,如何确定BarBaz中看到的对象是否指向内存中的同一对象?我想看GetHashCode()不一定是一个指标,因为我可以在GetHashCode()中覆盖Foo以总是返回0

除了在C#中不可能的事实以及我对指针的一点知识外,我想看看参考指向的地址会给我一定的确定性。

我有哪些选择?

1 个答案:

答案 0 :(得分:2)

Visual Studio调试器中有一个小功能,完全符合您的需求,而无需实现某些功能。

只需在方法上设置断点即可。当其中一个断点点击时,将您感兴趣的对象(f类型的Foo参数)添加到手表列表中。您确实可以在 Autos Locals 窗口中找到该对象。

然后执行操作:右键单击列表中的对象条目,然后选择生成对象ID 。数字ID显示在列表中对象值的右侧。

现在继续调试。当您的第二个断点点击时,您会在本地人 Autos 以及手表窗口中看到f对象出现具有相同的ID。这意味着 - 它是相同的对象实例。如果没有ID或它不同,那么这将是Foo的不同实例。