我来自C ++背景,如果这是一种非C#思维方式,请道歉,但我只需要知道。 :)
在C ++中,如果我有两个指针,并且我想知道它们是否指向相同的东西,我可以查看内存/监视窗口并查看它们的值 - 看它们是否指向相同的内存空间。
在C#中,我无法找到这些内容。一个具有完全相同值的引用类型实际上可能是完全相同的对象,或者它可能是完全不同的东西。
我有办法在C#中看到这种信息吗?也许某种等同于&观察窗口的操作员或某些人?
答案 0 :(得分:71)
您正在寻找的是对象ID。对于调试器中的任何referenc类型,您可以右键单击并说出“Make Object ID”。只要在调试器中显示该实例,这将为值列添加#后缀。您还可以将#1,#2等添加到监视窗口,以便以后再次查看它们。
步骤0 - 运行此代码
static void Main(string[] args)
{
var x = "a string";
var y = x;
System.Diagnostics.Debugger.Break();
}
步骤1 - 右键单击并选择“制作对象ID”
步骤2 - 实例现在显示1#后缀。注意:我在这一步中没有做任何特别的事。单击“生成对象ID”两个行后,立即更新以显示1#后缀,因为它们引用相同的实例。
第3步 - 通过在观察窗口添加1#来随时查看它们
答案 1 :(得分:4)
在C#项目中,如果右键单击其中一个变量窗口中的变量名称并选择“创建对象ID”,Visual Studio将为该实例分配一个唯一ID并将其显示在“值”列中。 ID看起来像{1#},{2#}等。如果两个对象具有相同的ID,则它们的引用相同。
在代码或立即窗口中,您还可以使用Object.ReferenceEquals()检查两个对象是否相同。
我不相信有一种很好的方法可以在调试器中获取对象的实际内存地址。我猜这是设计的,因为在托管应用程序的垃圾收集过程中,对象在内存中的位置可能会发生变化。当然你可以声明一个不安全的块,固定对象,并使用所有常用的C / C ++运算符获取指向它的指针。然后,您将能够在调试器中看到指针的值。我不建议这样做是一个好习惯 - 固定对象往往会破坏垃圾收集器维持有序堆的能力,这反过来会导致更糟糕的性能和内存消耗。
答案 2 :(得分:0)
您可以使用Immediate Window并使用Object.ReferenceEquals(obj1, obj2)对此进行测试!
答案 3 :(得分:0)