【发布时间】:2009-03-10 06:06:16
【问题描述】:
当我用 C/C++ 编程时,我经常在跟踪中包含指针值。这有助于关联跟踪消息之间的对象。在 C# 中,我没有可以跟踪的可用指针值。可追踪的对象 ID 有什么好的替代品吗??
我不知道如何获取底层内存地址,但即使我这样做也无济于事,因为 GC 可以移动对象。
【问题讨论】:
当我用 C/C++ 编程时,我经常在跟踪中包含指针值。这有助于关联跟踪消息之间的对象。在 C# 中,我没有可以跟踪的可用指针值。可追踪的对象 ID 有什么好的替代品吗??
我不知道如何获取底层内存地址,但即使我这样做也无济于事,因为 GC 可以移动对象。
【问题讨论】:
提示:在 Visual Studio 中,您可以在 locals/watch 窗口中右键单击对象,然后选择“Make Object ID”为对象赋予唯一标记。
【讨论】:
添加一个在每次构造函数调用时递增的类变量。将此类变量作为您自己的索引分配给该类。
class foo
{
private static int counter;
private int instance_counter;
public Foo()
{
instance_counter = counter;
counter++;
}
public string toString()
{
return "Foo "+instance_counter.toString();
}
}
可能无法直接编译,我这里没有编译器。
【讨论】:
使用 Object.GetHashCode()。可以从所有对象访问 GetHashCode() 方法,因为 C# 中的每个类都派生自 Object。但是只有在调用 Object.GetHashCode() 并且它的结果以某种方式用于为用户定义的类生成哈希码时,它才保证是唯一的。请注意,这并不是绝对保证您最终可能会为多个对象获得相同的 Hashcode。
【讨论】: