2013-03-22 86 views
17

调试时,我期待两个不同的类使用同一个对象实例。这两个对象的所有属性都是相同的,但它们是两个不同的实例。有没有办法告诉VS调试器?调试时,有没有办法判断一个对象是不是一个实例?

为了确切地回答,我能一个字段添加到类:

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

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

+3

Object.ReferenceEquals(obj1,obj2) – 2013-03-22 20:01:06

+0

@PeterRitchie那么你如何在调试器中做到这一点?需要检查的对象分为两个不同的类。 – 2013-03-22 20:09:16

+1

Shift + F9键入“Object.ReferenceEquals(obj1,obj2)”,然后按重新评估或添加监视。或者只需在“监视”窗口的“名称”列中键入“Object.ReferenceEquals(obj1,obj2)”。 – 2013-03-22 20:14:54

回答

34

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

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

enter image description here

enter image description here

+0

谢谢,但在调试时右键单击变量时看不到“Make object ID”。 – 2013-03-22 20:16:28

+0

Got it!您必须在您的本地人窗口中执行此操作:http://blogs.msdn.com/b/zainnab/archive/2010/03/04/make-objectid-vstipdebug0015.aspx。优秀的提示!谢谢! – 2013-03-22 20:18:08

+0

百万感谢你! – 2017-01-20 22:15:42

4

Object.Equals Method (Object, Object)

编辑:要检查参考平等使用ReferenceEquals

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

+1

这并不这样做,因为它虚拟。它可以被派生类覆盖。 – 2013-03-22 20:02:58

+3

使用ReferenceEquals,而不是Equals。 – 2013-03-22 20:04:03

+0

任何人都可以确认if(object)p1 ==(object)p2;会达到同样的效果,但速度更快一点?我不记得100%。 – 2013-03-22 20:10:17

1

除了上述问题的答案,也可以比较指针。如果您有两个对象obj1obj2,您可以使用:&obj1&obj2来检查(例如在监视窗口中)他们的地址。

请注意,对象可能会被.NET运行时左右移动,因此对同一对象进行的两次地址检查会被中间的某些代码执行分隔开来,从而导致地址不同。

相关问题