показ адреса ссылки в C # (отладка WCF) - PullRequest
4 голосов
/ 03 ноября 2010

Я отлаживаю проект WCF с двусторонней связью. У меня есть обратный вызов с данными, которые я храню в массиве клиента, WinForm, и использую их для рисования элемента управления. Как вы можете догадаться, данные исчезают из записи в массив (на самом деле в список), когда я читаю данные.

Для отладки я хотел бы посмотреть, пишу ли я и читаю один и тот же объект , чтобы функция обратного вызова не делала своего рода копию и выбрасывала ее. Например, я хочу увидеть адрес указателя this. Как мне это сделать в 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);
        }

Когда я отлаживаю, я сначала вхожу в обработчик обратного вызова и добавляю Card в cards
PaintCards() вызывает Invalidate и событие рисования запускается. Когда в cardPanel_Paint, cards.Count снова равен нулю.

С наилучшими пожеланиями.
Görgen

Ответы [ 2 ]

13 голосов
/ 03 ноября 2010

В окнах Watch / Locals / Autos вы можете щелкнуть правой кнопкой мыши по объекту и выбрать «Make Object ID», чтобы присвоить объекту идентификационный номер. Этот номер фактически совпадает с адресом нативного объекта; он служит для идентификации.

Идентичность объекта отслеживается во всех сборках мусора и уплотнениях, поэтому в течение всего жизненного цикла приложения вы можете определить, является ли определенный объект тем, который вы изначально пометили. Эта функция может помочь в вашей ситуации.

В этом сообщении в блоге есть быстрый обзор этой функции.

alt text

0 голосов
/ 03 ноября 2010

Адрес объекта в 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.

Если вы не можете понять это, вам нужно опубликовать код, чтобы показать, где что-то не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...