debugging 为什么我看不到某些对象的内存地址?

0g0grzrc  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(113)
    • bounty将在6天后过期**。回答此问题可获得+100声望奖励。Dominique希望引起更多人对此问题的关注:真是一团糟!在C++中,如果你想确保你处理的是同一个对象,你只需要内存地址。在C#中,你需要一个对象ID,这应该是使用1#可用的,但Visual Studio 2022似乎不再支持了,你需要放置$id,但当你放置它时,它似乎是未知的。

简单的问题:我有一个物体,我想识别它。后来我有一个物体,它应该是同一个物体,但我有一个印象,它不是。我怎么能确定呢?
我有一个基于TCP连接的对象模型,它属于Connections,而Connections属于Managers。看起来两个TCP连接是不同的,我可以看到这一点,但是当我试图查看它们所属的连接时,我得到错误消息CS0211: Cannot take the address of the given expression。有人知道为什么以及如何处理这个问题吗?
观察两个TCP连接的窗口内容:

&connectionManager.Connection.TcpConnection  0x00007fe80035f670
&Connection_For_Message.TcpConnection        0x00007fe70042bf08

=〉两个TCPConnection都在另一个内存地址中,因此它们明显不同(尽管它们所有的值、属性和属性都是相等的)。
当要求对连接进行相同操作时,此操作不起作用:

&connectionManager.Connection  error CS0211: Cannot take the address of the given expression    
&Connection_For_Message        0x00007fe700375230

为什么会这样?
供您参考:当我请求connectionManager.Connection(不是地址,只是数据)时,一切都很好。
先谢了

djmepvbi

djmepvbi1#

在代码的不同部分检索对象地址可能会产生误导,因为如果GC在中间运行,对象可能会被移动。最简单的方法是通过调用GetHashCode()方法检查对象的哈希代码。如果得到不同的数字,则两个对象肯定是不同的。但是相等的哈希代码并不意味着100%两个引用指向同一个对象。在这种情况下,您可以使用一个临时hack并将第一个对象存储在public static变量中,然后,当代码到达第二个对象时,按照@KlausGütter在注解中的建议使用Object.ReferenceEquals(obj1, obj2)

相关问题