C# 在调试器中唯一标识引用类型 我来自C++背景,如果这是非C思维方式,那么道歉,但我只需要知道。p> C++中,如果我有两个指针,我想知道它们是否指向同一个对象,我可以查看内存/监视窗口,看看它们的值,看看它们是否指向相同的内存空间。

C# 在调试器中唯一标识引用类型 我来自C++背景,如果这是非C思维方式,那么道歉,但我只需要知道。p> C++中,如果我有两个指针,我想知道它们是否指向同一个对象,我可以查看内存/监视窗口,看看它们的值,看看它们是否指向相同的内存空间。,c#,visual-studio,debugging,reference-type,C#,Visual Studio,Debugging,Reference Type,在C#中,我没能找到类似的东西。一个具有完全相同值的引用类型实际上可能是完全相同的对象,也可能是完全不同的对象 有没有办法让我在C#中看到这种信息?可能与监视窗口的&operator或类似的某种类型相当?您要查找的是对象id。对于调试器中的任何引用类型,都可以右键单击并说“makeobjectid”。每当调试器中显示该实例时,这将在值列中添加一个#后缀。您还可以添加#1、#2等。。。请转到“观察”窗口,以便以后随时再次看到它们 步骤0-运行此代码 static void Main(string[

在C#中,我没能找到类似的东西。一个具有完全相同值的引用类型实际上可能是完全相同的对象,也可能是完全不同的对象


有没有办法让我在C#中看到这种信息?可能与监视窗口的&operator或类似的某种类型相当?

您要查找的是对象id。对于调试器中的任何引用类型,都可以右键单击并说“makeobjectid”。每当调试器中显示该实例时,这将在值列中添加一个#后缀。您还可以添加#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,随时查看它们

您可以使用和来测试这一点

我认为您需要。

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

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


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

这很酷,我从来没有听说过对象id。这么多像这样的小东西被“隐藏”在VS.Awesome酱汁中。很好的解释和性感的视觉效果+1和正确的答案。:)它出现在VS 2015中,语法是$1、$2,等等。当您看到的对象不再存在时会发生什么?我正在调试一些与EF DbContext相关的东西,这些对象似乎保留在“局部变量”窗口中,即使(我希望)它们已经被释放了……要在“监视”窗口中查看变量的内存地址,请在变量名称前面加一个符号(&)。i、 e.:&varName。