Подтвердить что ты не робот

Уникальное определение ссылочных типов в отладчике

Я исхожу из С++-фона, поэтому извиняюсь, если это не-С# способ мышления, но мне просто нужно знать.:)

В С++, если у меня есть два указателя, и я хочу знать, указывают ли они на одно и то же, я могу посмотреть в окне памяти/просмотра и увидеть их значение - посмотреть, указывают ли они на одно и то же пространство памяти.

В С# я не смог найти что-то в этих строках. Один ссылочный тип с точно такими же значениями может фактически быть одним и тем же объектом, иначе он может быть чем-то совершенно иным.

Есть ли способ увидеть эту информацию на С#? Может быть, какой-то эквивалент оператора и для окна часов или некоторых таких?

4b9b3361

Ответ 1

То, что вы ищете, это идентификаторы объектов. Для любого типа ссылки в отладчике вы можете щелкнуть правой кнопкой мыши и сказать "Сделать идентификатор объекта" . Это добавит суффикС# в столбец значений всякий раз, когда этот экземпляр отображается в отладчике. Вы также можете добавить # 1, # 2 и т.д. В окно просмотра, чтобы увидеть их снова в любое время позже.

Шаг 0 - Запустите этот код

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

Шаг 1 - Щелкните правой кнопкой мыши и выберите "Сделать идентификатор объекта"

alt text

Шаг 2 - Экземпляры теперь отображаются с суффиксом 1 #. Примечание. На этом шаге я ничего особенного не делал. Сразу после нажатия "Сделать идентификатор объекта" обе строки обновлены, чтобы отобразить суффикс 1 #, поскольку они относятся к одному экземпляру.

alt text

Шаг 3 - Смотрите их в любое время, добавив 1 # в окно просмотра

alt text

Ответ 2

В проектах С#, если вы щелкните правой кнопкой мыши имя переменной в одном из окон переменных и выберите "создать идентификатор объекта", Visual Studio назначит уникальный идентификатор этому экземпляру и отобразит его в столбце "Значение". Идентификаторы выглядят как {1 #}, {2 #} и т.д. Если два объекта имеют одинаковый идентификатор, они ссылочно идентичны.

В коде или в окне Immediate вы также можете проверить, идентичны ли два объекта с помощью Object.ReferenceEquals().

Я не верю, что есть хороший способ получить фактический адрес памяти для объекта в отладчике. Я предполагаю, что по дизайну, поскольку местоположение объекта в памяти, вероятно, изменится во время сбора мусора в управляемом приложении. Конечно, вы можете объявить небезопасный блок, привязать объект и захватить указатель на него, используя все обычные операторы C/С++. Тогда вы сможете увидеть значение указателя в отладчике. Я бы не рекомендовал это как хорошую привычку, хотя - привязка объектов имеет тенденцию гасить с возможностью сбора мусора поддерживать аккуратную кучу, что в свою очередь может привести к снижению производительности и потреблению памяти.