如何打印对象ID?

`我需要知道来自程序完全不同部分的两个引用是否引用同一个对象。 我无法比较programaticaly的参考,因为它们来自不同的上下文(一个参考从另一个不可见,反之亦然)。

然后我想使用Console.WriteLine()为每个对象打印唯一标识符。 但是ToString()方法不返回“唯一”标识符,它只返回“classname”。

是否可以在C#中打印唯一标识符(如在Java中)?

您可以轻松获得的最接近的(不会受到GC移动对象等影响)可能是RuntimeHelpers.GetHashCode(Object) 。 这给出了通过在对象上非虚拟地调用Object.GetHashCode()返回的哈希码。 但这仍然不是唯一的标识符。 它可能足以用于诊断目的,但您不应该依赖它进行生产比较。

编辑:如果这只是用于诊断,你可以添加一种“规范化ID生成器”,它只是一个List …当你要求一个对象的“ID”时,你要检查它是否已经存在于列表(通过比较引用),然后将其添加到最后,如果它没有。 ID将是列表中的索引。 当然,在不引入内存泄漏的情况下执行此操作会涉及弱引用等,但作为一个简单的hack,这可能对您有用。

一个参考从另一个参考不可见,反之亦然

我不买。 如果你甚至无法拿到手柄,你会如何得到他们的身份证?

在C#中,您始终可以获取对象的句柄,并且您始终可以比较它们。 即使你必须使用reflection来做到这一点。

如果你需要知道两个引用是否指向同一个对象,我只会引用它 。

默认情况下,operator ==测试引用相等性。 这是通过确定两个引用是否指示相同的对象来完成的。 因此,引用类型不需要实现operator ==以获得此function。

因此,==运算符将执行该操作而不执行Id解决方法。

我假设你在你的object引用上调用ToString ,但不完全清楚这个或你解释的情况,TBH,所以请耐心等待我。

该类型是否公开了ID属性? 如果是这样,试试这个:

 var idAsString = yourObjectInstance.ID.ToString(); 

或者,直接打印:

 Console.WriteLine(yourObjectInstance.ID); 

编辑:

我看到乔恩看到了这个问题,并让我的答案看起来相当幼稚 – 无论如何,我只是为了强调问题的缺乏清晰度而留下它。 而且,也许,如果您决定通过标识符公开自己的唯一性,那么基于Jon的声明‘This [ GetHashCode ]仍然不是唯一标识符’ ,提供一条下去的途径。