2010-11-22 25 views
36

我來自C++背景,非常抱歉,如果這是一種非C#思維方式,但我只需要知道。 :)在調試器中唯一標識引用類型

在C++中,如果我有兩個指針,並且我想知道他們是否指向相同的東西,我可以查看內存/監視窗口並查看它們的值 - 以查看它們是否指向相同內存空間。

在C#中,我一直無法找到這方面的內容。一個具有完全相同值的參考類型實際上可能是完全相同的對象,或者它可能是非常不同的東西。

有沒有辦法讓我看到這種信息在C#中?也許某種相當於&運營商的觀察窗口或一些這樣的?

回答

67

你要找的是對象ID。對於調試器中的任何引用類型,您可以右鍵單擊並說出「創建對象ID」。每當該實例顯示在調試器中時,這將爲值列添加一個#後綴。您還可以在觀看窗口中添加#1,#2等...以後再次查看它們。

步驟0 - 運行這段代碼

static void Main(string[] args) 
{ 
    var x = "a string"; 
    var y = x; 
    System.Diagnostics.Debugger.Break(); 
} 

第1步 - 單擊右鍵,選擇 「使對象ID」

alt text

第2步 - 實例現在用1個#後綴顯示。注意:這一步我沒有做任何特別的事情。在單擊「創建對象ID」後,立即將行更新爲顯示1#後綴,因爲它們引用了相同的實例。

alt text

第3步 - 通過添加1#到監視窗口

alt text

+7

這很酷,我從來沒有聽說過對象ID。很多這樣的小東西都是VS中隱藏的。 – 2010-11-22 23:59:18

3

在C#項目中,如果在其中一個變量窗口中右鍵單擊某個變量的名稱並選擇「創建對象ID」,Visual Studio將爲該實例分配一個唯一的ID並將其顯示在Value列中。這些ID看起來像{1#},{2#}等。如果兩個對象具有相同的ID,則它們在引用上相同。

在代碼或即時窗口中,還可以使用Object.ReferenceEquals()檢查兩個對象是否相同。

我不認爲有一個好方法可以在調試器中獲取對象的實際內存地址。我猜是這樣設計的,因爲對象在內存中的位置可能在託管應用程序中的垃圾回收期間發生更改。當然你可以聲明一個不安全的塊,固定對象,並使用所有常用的C/C++操作符來獲取指針。然後,您將能夠在調試器中看到指針的值。儘管如此,我不會建議將其作爲一種良好的習慣,因爲固定對象往往會使垃圾收集器保持有序堆的能力變差,從而導致更糟的性能和內存消耗。