2011-09-02 51 views
7

假設你正在調試。在方法A中,您有一個參數foo類型爲Foo。稍後,您在方法B中,該方法也使用Foo類型的參數foo。如何確定兩個變量在不同範圍內的引用相等性?

這兩個變量可能是相同的Foo實例,但你怎麼看?由於它們的範圍不同,因此不能撥打ReferenceEquals()。有什麼方法可以獲得變量指向的實際內存位置,以便您可以確定它們是否是實例?

回答

6

我相信你可以使用Make Object ID功能。更多相關信息可以發現here,但總結:

  1. 設置在你的代碼中設置斷點,你可以得到一個對象變量是在範圍內。
  2. 運行你的代碼,讓它在BreakPoint處停下來。
  3. 在您的Locals或Autos窗口中,右鍵單擊對象變量(注意Value列)並從上下文菜單中選擇「Make Object ID」。
  4. 您現在應該在「值」列中看到新的ID號(#)。

「標記」對象後,您將在第二次調用Foo時看到分配的ID。

+0

非常好。這是在VS的舊版本中可用或是一個新的東西? – Chris

+0

@Chris - 我現在沒有VS2008,但是該頁面表示它在2008年和2010年受支持。我已在VS2010中對此進行了驗證。 – CodeNaked

+0

對,對不起。我只是在我問完後才注意到。 :( – Chris

1

在調試器中,您可以將對第一個方法中的對象的引用存儲到靜態字段,然後將第二個方法中的變量與靜態字段進行比較。

+1

感謝您的建議。你的意思是你必須在調試之前在代碼中創建一個靜態字段才能獲得該值?有點侵入性也許...... – David

+0

是的,你必須這樣做。 –

0

你可以得到一個指向你的變量的指針,但是這需要在一個不安全的塊中運行。

一旦你「unsafed」你可以聲明的一個指針美孚這樣的:

Foo* p = &myFoo; 

這已經已經在這裏討論了SO:

C# memory address and variable

0

正如馬克CIDADE的建議的一種改進中,當第一方法中鍵入以下到即時窗口:

var whatever = foo; 

然後,當在第二方法中,鍵入以下內容:

bool test = object.ReferenceEquals(whatever, foo); 

即時窗口將顯示測試結果。

但CodeNaked的建議更好。

相關問題