2011-04-18 140 views
6

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

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

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

+1

你可以给一个用例,这是有道理的吗?试图比较没有参考的对象是没有意义的。 – Tejs 2011-04-18 14:05:11

回答

16

最接近你可以很容易地得到(它不会受到GC移动物体等)的影响可能是RuntimeHelpers.GetHashCode(Object)。这给出了通过在对象上非虚拟地调用Object.GetHashCode()返回的散列码。尽管如此,这仍然是而不是的唯一标识符。对于诊断目的来说,这可能已经足够了,但是你不应该依靠它来进行生产比较。

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

+0

Blindy的回答不正确?这个问题不是没有争议吗? – 2011-04-18 14:17:28

+0

@Adam:查看我对Blindy的回答的评论。只是基于这个问题进行猜测,但是它有一定的意义。 – 2011-04-18 14:21:30

+0

啊 - 这很有道理。谢谢乔恩。 – 2011-04-18 14:22:43

2

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

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

在C#中,您总是可以获取对象的句柄,并且可以随时比较它们。即使你必须使用反射来做到这一点。

+1

我怀疑你是否缺少OP如何诊断问题......在某个时间点打印出一些描述的对象引用,然后打印出另一个描述,然后直观地比较它们。在这个过程中,任何一段代码都不能同时访问两个引用。无论如何,这是我的猜测。 – 2011-04-18 14:19:41

+0

@Jon,如果这是他的意图,他总是可以将它们添加到“全局”列表中,并在某个时间点用“object.Equals”检查列表内容。但我承认,我没有想到他的问题的任何实际应用<。< – Blindy 2011-04-18 14:26:37

+0

是 - 这是我的编辑基本上建议:) – 2011-04-18 14:29:02

0

我认为你打电话ToString在你的object参考,但不完全清楚在这个或你解释的情况,TBH,所以只是忍耐与我。

该类型是否显示ID属性?如果是的话,试试这个:

var idAsString = yourObjectInstance.ID.ToString(); 

或者,直接打印:

Console.WriteLine(yourObjectInstance.ID); 

编辑:

我看到乔恩的权利,通过这个问题看出来了,让我的答案看起来相当天真 - 无论如何,如果没有别的办法,我会留下来,以强调问题的不清晰。并且,也许,根据Jon的陈述,如果您决定通过标识符公开您自己的唯一性,则可以根据Jon的陈述提供一条途径,以便'This [GetHashCode]仍然不是唯一标识符'

1

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

默认情况下,运算符==测试 引用等式。这由 完成确定两个参考是否指示 相同的对象。因此参考 类型不需要执行 运算符==为了获得这个 功能。

因此,==运算符将不做Id解决方法。

+2

“我不能比较引用programaticaly” – 2011-04-18 14:06:20

+0

然后我的答案是“否这是不可能的“除非你创建一个GUID的CustomId并比较这些GUID。或者在这里告诉你GetHashCode()方法。 – apacay 2011-04-18 14:15:11