如何确定不同范围内两个变量的引用相等?

时间:2011-09-02 15:52:56

标签: c# visual-studio-2010 debugging visual-studio-debugging

假设您正在调试。有一次你在方法A中,它有一个类型为Foo的参数foo。稍后您将进入方法B,它还采用Foo类型的参数foo。

这两个变量可能是相同的Foo实例,但您如何判断?由于它们的范围不同,因此您无法调用ReferenceEquals()。有没有什么方法可以获得变量指向的实际内存位置,以便您可以判断它们是否是实例?

4 个答案:

答案 0 :(得分:6)

我相信您可以使用Make Object ID功能。有关这方面的更多信息可以在here找到,但总结一下:

  1. 在代码中设置BreakPoint,您可以在其中找到范围内的对象变量。
  2. 运行您的代码,让它停在BreakPoint。
  3. 在“本地或自动窗口”中,右键单击对象变量(请注意“值”列),然后从上下文菜单中选择“生成对象ID”。
  4. 您现在应该在“值”列中看到新的ID号(#)。
  5. 在“标记”对象后,您将在第二次调用Foo时看到分配的ID。

答案 1 :(得分:1)

在调试器中,您可以将第一个方法中对象的引用存储到静态字段,然后将第二个方法中的变量与静态字段进行比较。

答案 2 :(得分:0)

你可以得到一个指向变量的指针,但这需要在一个不安全的块中运行。

一旦你“无人”,你可以像这样声明指向你的Foo的指针:

Foo* p = &myFoo;

这已经在SO中讨论过:

C# memory address and variable

答案 3 :(得分:0)

作为Mark Cidade建议的一个发展,当在第一个方法内部时,将以下内容输入到即时窗口中:

var whatever = foo;

然后,在第二种方法中,键入以下内容:

bool test = object.ReferenceEquals(whatever, foo);

即时窗口将显示测试结果。

然而,CodeNaked的建议更好。