如何打印对象ID?

时间:2011-04-18 14:00:49

标签: c#

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

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

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

4 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:3)

  

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

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

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

答案 2 :(得分:1)

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

  

默认情况下,运算符==测试   参考平等。这是通过   确定两个引用是否表明   同一个对象。因此参考   类型不需要实现   operator ==为了获得这个   功能。

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

答案 3 :(得分:0)

我认为你在ToString引用上打电话给object,但对此或你所解释的情况TBH并不完全清楚,所以请耐心等待。

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

var idAsString = yourObjectInstance.ID.ToString();

或者,直接打印:

Console.WriteLine(yourObjectInstance.ID);

修改

我看到乔恩看到了这个问题,并且让我的答案看起来相当幼稚 - 无论如何,除非强调问题的不清晰,否则我会把它留在原处。而且,也许,如果您决定通过方式公开自己的独特性,根据Jon的陈述'这[GetHashCode]仍然不是唯一标识符,提供一条下去的途径标识符。