如何确定不同作用域中两个变量的引用相等性?

7

假设您正在进行调试。某个时刻,您正在方法A中,它有一个名为foo的参数,类型为Foo。稍后,您在方法B中,也有一个类型为Foo的参数foo。

这两个变量可能是同一个Foo实例,但是如何判断呢?由于它们处于不同的作用域,您无法调用ReferenceEquals()。是否有一种方法可以获取变量指向的实际内存位置,以便您可以确定它们是否是同一个实例?

4个回答

6
我相信你可以使用“创建对象 ID”功能。更多信息可以在这里找到,但总结如下:
  1. 在您可以访问作用域内的对象变量的代码中设置断点。
  2. 运行代码并让它停在断点处。
  3. 在 Locals 或 Autos 窗口中,右键单击对象变量(注意 Value 列),然后从上下文菜单中选择“创建对象 ID”。
  4. 现在,您应该在 Value 列中看到一个新的 ID 号 (#)。
在“标记”对象之后,您将在第二次调用 Foo 时看到分配的 ID。

非常好。这在旧版本的VS中可用还是一个新功能? - Chris
@Chris - 我现在没有VS2008在身边,但是页面上说它支持2008和2010版本。我已经在VS2010中验证过了。 - CodeNaked
是的,抱歉。我问完才注意到这个问题。:( - Chris

1

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


1
谢谢您的建议。您是指在调试之前必须在代码中创建一个静态字段才能接收值吗?可能有点侵入性... - David

0
作为Mark Cidade建议的开发,在第一个方法内输入以下内容到立即窗口中:
var whatever = foo;

然后,在第二个方法中,输入以下内容:

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

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

然而,CodeNaked的建议更好。


0

你可以通过获取变量的指针来完成操作,但这需要在不安全模式下运行。

一旦你进入了 "不安全" 模式,就可以像这样声明一个指向 Foo 的指针:

Foo* p = &myFoo;

这个问题在SO上已经讨论过了:

C#内存地址和变量


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接