Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以获取C对象地址的字符串表示形式?_C#_Reference_Identity - Fatal编程技术网

C# 是否可以获取C对象地址的字符串表示形式?

C# 是否可以获取C对象地址的字符串表示形式?,c#,reference,identity,C#,Reference,Identity,我正在尝试调试多线程代码的一些奇怪行为,我需要一些方法来可靠地跟踪对象标识。在C++中,我只需获取对象地址并将它们转换成字符串,这样我就知道这两个地址是否是同一个对象。 看起来像是C++对象地址在C. 我可以将引用转换为字符串地址表示形式吗?您可以将引用转换为指针,然后再转换为数字,但这不是跟踪C中对象的可靠方法,因为垃圾收集器可以随时更改引用。一旦从引用中复制了值,就无法知道它仍然表示引用 但是,您可以安全地比较引用。只要引用仍然是引用,垃圾收集器就会确保它是最新的。如果垃圾收集器移动对象,它

我正在尝试调试多线程代码的一些奇怪行为,我需要一些方法来可靠地跟踪对象标识。在C++中,我只需获取对象地址并将它们转换成字符串,这样我就知道这两个地址是否是同一个对象。

看起来像是C++对象地址在C.</P>


我可以将引用转换为字符串地址表示形式吗?

您可以将引用转换为指针,然后再转换为数字,但这不是跟踪C中对象的可靠方法,因为垃圾收集器可以随时更改引用。一旦从引用中复制了值,就无法知道它仍然表示引用

但是,您可以安全地比较引用。只要引用仍然是引用,垃圾收集器就会确保它是最新的。如果垃圾收集器移动对象,它将更新对该对象的所有引用

因此,您可以安全地将引用用作对象的标识,只要将其保留为引用即可。您可以比较两个引用以查看它们是否指向同一对象

如果将引用的值转换为不同的形式,则会得到该引用当时的闪存副本。虽然看到该值可能仍然有用,但它不是100%可靠的,即仅仅因为两个引用的表示不同并不意味着它们不能指向同一个对象,因为引用可能在复制第一个和第二个对象之间发生了更改

也就是说,以下是如何获取指向对象的指针并将其转换为IntPtr:

在某种程度上,您可以:

GCHandle.Alloc(obj, GCHandleType.Pinned).AddrOfPinnedObject().ToString();

请不要将此用作调试多线程应用程序的方法。按照Damien指出的做。

创建一个ConditionalWeakTable,当您看到表中不存在的每个对象时,为其指定某种名称并将其存储在表中。然后,只需使用该表,您就可以毫不费力地打印出您以前看到的任何对象的名称。如果一个对象不再存在,那么表条目将消失,因此不必担心表中充满了与早已被放弃的对象相关的信息。

ReferenceEquals有什么问题?如果是跨时间的比较,当然这不起作用,因为.NET对象可能会由于GC而移动。@Damien_The_unsiever:这需要一些对象的内部列表和内部比较。我更喜欢查看日志并从中得出结论。那么,这是一个跨时间的比较?使用关键字。@Damien_the_Unsiever:如果日志中有地址,我就可以很方便地编写很多额外的代码来维护列表并找出哪个对象是哪个对象。我需要一些直接的等价于C++ Primtf%P.EL的编译器,它不会隐式编译对象来空缺*.@它对不同的数据类型有点不同。。。实际上,我用一个字符串测试了它,结果就是这样。
GCHandle.Alloc(obj, GCHandleType.Pinned).AddrOfPinnedObject().ToString();