2010-11-03 19 views
3

我正在調試一個WCF項目與雙向通信。我有一個數據回調函數,我在數組中存儲客戶端,一個WinForm,並用它來繪製一個控件。正如你所猜測的,當我讀取數據時,數據從寫入數組(真的是一個列表)中消失。顯示在C#中的引用地址(調試WCF)

對於調試,我想看看我是否寫入和閱讀相同的對象,以便回調函數沒有做出某種副本並將其扔掉。例如,我想查看這個指針的地址。我如何在VS2010 Exp中做到這一點?

編輯
一些代碼:

字段聲明:

// the cards that the player have 
    private List<Card> cards = new List<Card>(); 

回調處理:

private void btnDraw_Click(object sender, EventArgs e) 
    { 
     Tuple<Card, string> update = PressedDraw(this); 
     cards.Add(update.Item1); 
     PaintCards(); 
    } 

漆事件:

private void cardPanel_Paint(object sender, PaintEventArgs e) 
    { 
     int counter = 0; 
     Point fromCorner = new Point(20,12); 
     int distance = 50; 
     foreach (Card card in cards) 
     { 
      Point pos = fromCorner; 
      pos.Offset(counter++ * distance, 0); 
      Bitmap cardBitmap = 
       cardFaces[Convert.ToInt32(card.suit), 
        Convert.ToInt32(card.rank)]; 

      Rectangle square = new Rectangle(pos, cardBitmap.Size); 
      e.Graphics.DrawImage(cardBitmap, square); 
     } 

當我調試我在回調處理程序首先進入並增加了Cardcards
PaintCards()電話Invalidate和油漆的事件時運行。當在cardPanel_Paint時,cards.Count再次爲零。

此致敬禮。
Görgen

回答

13

在Watch/Locals/Autos窗口中,您可以右鍵單擊一個對象並選擇「Make Object ID」爲該對象提供一個標識號。這個數字實際上與本地對象的地址相同;它用來識別。

跨垃圾收集和壓縮跟蹤對象的身份,因此,在應用程序的整個生命週期中,您可以判斷某個對象是否是您最初標記的對象。此功能可能有助於您的情況。

This blog post具有該功能的快速運行。

alt text

+0

謝謝你的回答,它是同一個對象。 – Gorgen 2010-11-03 08:06:38

+0

非常感謝 - 謝謝! – Andy 2011-05-17 12:55:01

1

c#中的一個對象的地址可以被垃圾回收器改變,所以你不能使用它(並且沒有直接的方法來做到這一點)。

但是,您可以使用Object.ReferenceEquals與對象進行比較以查看它們是否真的相同。

編輯:
但它看起來像你已經搞砸了這樣的東西。

var a = new List<string> { "String1" }; 
var b = a; 
a = new List<string> { "String 2" }; // really GetListFromWcf(); 
Console.WriteLine(b[0]); 

此打印String1,不String2

如果你不能弄清楚,你需要張貼一些代碼來顯示出錯的地方。

+0

謝謝你的指針。問題在於,假設是同一個對象,後來只有一個F5,它們在時間上是分開的。有任何想法嗎? – Gorgen 2010-11-03 07:36:42

+0

@Gorgen,你需要顯示一些代碼你在做什麼。你能發佈一個簡單的例子失敗嗎? – 2010-11-03 07:41:45

+0

是的,我搞砸了,我以相反的順序收回了兩個回調,第一個寫回,第二個回收數據。男子大腿跌倒,男子保姆下車後,你可以在所有車輛上行駛 – Gorgen 2010-11-03 08:09:56