`我需要知道来自程序完全不同部分的两个引用是否引用同一个对象。 我无法比较programaticaly的引用,因为它们来自不同的上下文(一个引用从另一个引用不可见,反之亦然)。
然后我想使用Console.WriteLine()
为每个对象打印唯一标识符。但ToString()
方法不返回“唯一”标识符,只返回“classname”。
是否可以在C#中打印唯一标识符(如在Java中)?
答案 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
]仍然不是唯一标识符,提供一条下去的途径标识符。