在debugging器中唯一标识引用types

我来自C ++的背景,所以如果这是一个非C#的思维方式,我很抱歉,但我只需要知道。 🙂

在C ++中,如果我有两个指针,而且我想知道它们是否指向相同的东西,我可以查看内存/监视窗口并查看它们的值 – 看它们是否指向相同的内存空间。

在C#中,我一直无法find这方面的东西。 一个具有完全相同值的引用types实际上可能是完全相同的对象,或者它可能是非常不同的东西。

有没有办法让我看到这种信息在C#中? 也许某种相当于观察窗口的&运算符或一些这样的?

你要找的是对象ID。 对于debugging器中的任何参考types,您可以右键单击并说“生成对象ID”。 只要该实例显示在debugging器中,就会在值列中添加一个#后缀。 您也可以将#1,#2等添加到观察窗口,以后再次看到它们。

第0步 – 运行这个代码

static void Main(string[] args) { var x = "a string"; var y = x; System.Diagnostics.Debugger.Break(); } 

第1步 – 右键单击​​并select“Make Object Id”

替代文字

第2步 – 实例现在以1#后缀显示。 注意:这一步我没有做任何特别的事情。 在单击“Make Object Id”后,立即将行更新为显示1#后缀,因为它们引用同一个实例。

替代文字

第3步 – 随时在观看窗口中添加1#以查看它们

替代文字

在C#项目中,如果在其中一个variables窗口中右键单击某个variables的名称并select“创build对象ID”,Visual Studio将为该实例分配一个唯一的ID并将其显示在“值”列中。 这些ID看起来像{1#},{2#}等。如果两个对象具有相同的ID,那么它们在语法上是相同的。

在代码或立即窗口中,还可以使用Object.ReferenceEquals()检查两个对象是否相同。

我不相信在debugging器中有一个好的方法来得到一个对象的实际内存地址。 我猜是这样devise的,因为在托pipe应用程序的垃圾收集过程中,对象在内存中的位置可能会发生变化。 当然,你可以声明一个不安全的块,固定这个对象,并使用所有常用的C / C ++操作符来获取一个指向它的指针。 然后你将能够在debugging器中看到指针的值。 我不build议把它作为一个好习惯,尽pipe固定对象往往会使垃圾收集器维持一个有序的堆的能力,反过来会导致更糟糕的性能和内存消耗。

你可以使用立即窗口并使用Object.ReferenceEquals(obj1,obj2)来testing这个!

我想你想要System.Object.ReferenceEquals函数 。