【问题标题】:When debugging, is there a way to tell if an object is a different instance?调试时,有没有办法判断一个对象是否是不同的实例?
【发布时间】:2015-08-11 07:57:22
【问题描述】:

在调试时,我期望两个不同的类使用同一个对象实例。这两个对象的所有属性都相同,但它们是两个不同的实例。有没有办法在 VS 调试器中说明这一点?

为了确定,我可以在类中添加一个字段:

private string someId = Guid.NewGuid().ToString();

然后,在调试时,我至少可以查看两个实例中的每一个的那个字段。有没有更好的方法不必创建这个虚拟 ID 字段?

【问题讨论】:

  • Object.ReferenceEquals(obj1, obj2)
  • @PeterRitchie 那么您如何在调试器中执行此操作?需要检查的对象位于两个不同的类中。
  • Shift+F9,输入“Object.ReferenceEquals(obj1, obj2)”,然后按重新评估或添加观察。或者只需在 Watch 窗口的 Name 列中键入“Object.ReferenceEquals(obj1, obj2)”。

标签: c# debugging visual-studio-2012


【解决方案1】:

调试时,在Locals窗口中,右键单击实例并选择“Make Object ID”。

这将添加此实例的唯一编号,每当您看到此实例时都会显示 调试器中的实例(在工具提示和监视窗口中)。

【讨论】:

  • 谢谢,但我在调试时右键单击变量时没有看到“制作对象 ID”。
  • 知道了!您必须在本地窗口中执行此操作:blogs.msdn.com/b/zainnab/archive/2010/03/04/…。优秀的提示!谢谢!
  • 当你使用这个选项时,当对象被释放时会发生什么?我正在调试一些与 EF DbContext 相关的东西,这些对象似乎保留在 Locals 窗口中,即使(我希望)它们已经被释放了......
【解决方案2】:

Object.Equals Method (Object, Object)

编辑:要检查引用是否相等,请使用ReferenceEquals

编辑 2:调试时,转到调试菜单,窗口 --> 即时窗口(智能感知应该在这里工作)和?Object.ReferenceEquals(obj1, obj2)

【讨论】:

  • 那不行,因为它是虚拟的。它可以被派生类覆盖。
  • 使用 ReferenceEquals,而不是 Equals。
  • 谁能确认 (object)p1 == (object)p2;会实现同样的事情,但要快一点?我不记得 100%。
  • 小费+1,但沃尔夫冈的回答正是我想要的。谢谢!
【解决方案3】:

除了上面的答案,还可以比较指针。如果您有两个对象 obj1obj2,您可以检查(例如在监视窗口中)它们的地址:&obj1&obj2

请注意,对象可能会被 .NET 运行时移动,因此对同一对象的两次地址检查以及其间的一些代码执行可能会导致不同的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多