2010-11-03 50 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