如何打印对象ID

本文关键字:对象 ID 打印 何打印 | 更新日期: 2023-09-27 17:50:41

'我需要知道来自程序完全不同部分的两个引用是否指向同一个对象。我不能用编程方式比较引用,因为它们来自不同的上下文中(一个引用对另一个引用是不可见的,反之亦然)。

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

是否有可能在c#中打印唯一标识符(如Java)?

如何打印对象ID

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

编辑:如果这只是用于诊断,您可以添加一种"规范化ID生成器",这只是一个List<object>…当您请求一个对象的"ID"时,您将检查它是否已经存在于列表中(通过比较引用),如果不存在,则将其添加到末尾。ID将是列表的索引。当然,这样做而不引入内存泄漏会涉及弱引用等,但作为一个简单的hack,这可能对您有用。

一个引用对另一个引用不可见,反之亦然

我不相信。如果你连把手都弄不到,你怎么知道他们的身份?

在c#中,你总是可以得到对象的句柄,并且你总是可以比较它们。即使你必须使用反射来实现它

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

默认情况下,操作符==测试参考平等。这是由确定两个引用是否指示同样的物体。因此参考类型不需要实现操作符==来获得这个功能。

所以,==运算符可以完成这个任务,而不需要处理Id。

我猜你是在object参考上调用ToString,但对这一点或你解释的情况并不完全清楚,TBH,所以请耐心听我说。

类型是否暴露了ID属性?如果是,试试这个:

var idAsString = yourObjectInstance.ID.ToString();

或者直接打印:

Console.WriteLine(yourObjectInstance.ID);

编辑:

我看到Jon看穿了这个问题,让我的回答看起来很幼稚——不管怎样,我把它留在里面只是为了强调这个问题不够清晰。而且,如果您决定通过标识符的方式暴露您自己的唯一性,也许可以根据Jon的声明"This [GetHashCode]仍然不是唯一标识符"提供一条途径。