在调试器中唯一标识引用类型

Edd*_*ker 44 c# debugging reference-type visual-studio

我来自C++背景,如果这是一种非C#思维方式,那么道歉,但我只需要知道.:)

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

在C#中,我无法找到这些内容.一个具有完全相同值的引用类型实际上可能是完全相同的对象,或者它可能是完全不同的东西.

有没有办法让我在C#中看到这种信息?或许某种等同于观察窗口的&运算符或某些类似的?

Jar*_*Par 73

您正在寻找的是对象ID.对于调试器中的任何referenc类型,您可以右键单击并说出"Make Object ID".只要在调试器中显示该实例,这将在值列中添加#后缀.您还可以将#1,#2等添加到监视窗口,以便以后再次查看它们.

第0步 - 运行此代码

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

第1步 - 右键单击​​并选择"生成对象ID"

替代文字

第2步 - 实例现在显示1#后缀.注意:我在这一步中没有做任何特别的事.单击"生成对象ID"后,两个行都会立即更新以显示1#后缀,因为它们引用同一个实例.

替代文字

第3步 - 通过在监视窗口添加1#随时查看它们

替代文字

  • 这很酷,我从来没有听说过对象id.这么多像这样的小东西在VS中被"隐藏"了. (8认同)
  • 出现在VS 2015中的语法为$ 1,$ 2等 (2认同)

Sea*_*n U 5

在 C# 项目中,如果在变量窗口之一中右键单击变量名称并选择“创建对象 ID”,Visual Studio 将为该实例分配一个唯一 ID 并将其显示在“值”列中。ID 看起来像 {1#}、{2#} 等。如果两个对象具有相同的 ID,那么它们在引用上是相同的。

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

我不相信有什么好方法可以在调试器中获取对象的实际内存地址。我猜这是设计使然,因为对象在内存中的位置可能会在托管应用程序中的垃圾收集期间发生变化。当然,您可以声明一个不安全的块,固定对象,并使用所有常用的 C/C++ 运算符获取指向它的指针。然后您就可以在调试器中看到指针的值。不过,我不建议将其作为一个好习惯 - 固定对象往往会破坏垃圾收集器维护有序堆的能力,这反过来会导致性能和内存消耗变差。