Уникальное определение ссылочных типов в отладчике
Я исхожу из С++-фона, поэтому извиняюсь, если это не-С# способ мышления, но мне просто нужно знать.:)
В С++, если у меня есть два указателя, и я хочу знать, указывают ли они на одно и то же, я могу посмотреть в окне памяти/просмотра и увидеть их значение - посмотреть, указывают ли они на одно и то же пространство памяти.
В С# я не смог найти что-то в этих строках. Один ссылочный тип с точно такими же значениями может фактически быть одним и тем же объектом, иначе он может быть чем-то совершенно иным.
Есть ли способ увидеть эту информацию на С#? Может быть, какой-то эквивалент оператора и для окна часов или некоторых таких?
Ответы
Ответ 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/С++. Тогда вы сможете увидеть значение указателя в отладчике. Я бы не рекомендовал это как хорошую привычку, хотя - привязка объектов имеет тенденцию гасить с возможностью сбора мусора поддерживать аккуратную кучу, что в свою очередь может привести к снижению производительности и потреблению памяти.
Ответ 3
Вы можете использовать Immediate Window и использовать Object.ReferenceEquals(obj1, obj2), чтобы проверить это!
Ответ 4
Я думаю, вы хотите функцию System.Object.ReferenceEquals.