【问题标题】:How to determine reference equality of two variables in different scope?如何确定不同范围内的两个变量的引用相等?
【发布时间】:2011-11-09 07:20:37
【问题描述】:

假设您正在调试。在某一时刻,您处于方法 A 中,该方法具有类型为 Foo 的参数 foo。稍后您将使用方法 B,该方法也采用 Foo 类型的参数 foo。

这两个变量很可能是同一个Foo 实例,但是你怎么知道呢?因为它们在不同的范围内,所以你不能调用ReferenceEquals()。有什么方法可以获取变量指向的实际内存位置,以便判断它们是否是实例?

【问题讨论】:

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


    【解决方案1】:

    根据 Mark Cidade 的建议,在第一个方法中,在即时窗口中键入以下内容:

    var whatever = foo;
    

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

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

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

    不过,CodeNaked 的建议更好。

    【讨论】:

      【解决方案2】:

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

      1. 在代码中设置断点,您可以在其中访问范围内的对象变量。
      2. 运行您的代码并让它在断点处停止。
      3. 在“局部变量”或“自动”窗口中,右键单击对象变量(注意“值”列),然后从上下文菜单中选择“生成对象 ID”。
      4. 您现在应该会在“值”列中看到一个新的 ID 号 (#)。

      “标记”对象后,您将在第二次调用 Foo 时看到分配的 ID。

      【讨论】:

      • 非常好。这在旧版本的 VS 中可用还是新事物?
      • @Chris - 我现在没有 VS2008,但页面上说它在 2008 年和 2010 年受支持。我已经在 VS2010 中验证了这一点。
      • 是的,对不起。我只是在我询问之后才注意到这一点。 :(
      【解决方案3】:

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

      一旦你“不安全”,你可以像这样声明一个指向你的 Foo 的指针:

      Foo* p = &myFoo;
      

      这已经在 SO 中讨论过:

      C# memory address and variable

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 感谢您的建议。您的意思是您必须在调试之前在代码中创建一个静态字段才能接收该值?可能有点侵入性......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 2023-03-21
        • 2011-03-26
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多