Уникальная идентификация ссылочных типов в отладчике
Я родом из C++, поэтому прошу прощения, если это не C# способ мышления, но мне просто нужно знать.:)
В C++, если у меня есть два указателя, и я хочу знать, указывают ли они на одно и то же, я могу посмотреть в окне памяти / просмотра и увидеть их значение - чтобы увидеть, указывают ли они на одно и то же пространство памяти.
В C# я не смог найти что-то подобное. Один ссылочный тип с точно такими же значениями может фактически быть одним и тем же объектом, или это может быть что-то совершенно другое.
Есть ли способ для меня, чтобы увидеть такую информацию в C#? Возможно, это какой-то эквивалент оператора & для окна просмотра или что-то подобное?
4 ответа
То, что вы ищете, это идентификаторы объектов. Для любого типа ссылки в отладчике вы можете щелкнуть правой кнопкой мыши и сказать "Make Object ID". Это добавит суффикс # к столбцу значения всякий раз, когда этот экземпляр отображается в отладчике. Вы также можете добавить #1, #2 и т.д... в окно просмотра, чтобы увидеть их снова в любое время позже.
Шаг 0 - Запустите этот код
static void Main(string[] args)
{
var x = "a string";
var y = x;
System.Diagnostics.Debugger.Break();
}
Шаг 1 - Щелкните правой кнопкой мыши и выберите "Make Object Id"
Шаг 2 - Экземпляры теперь отображаются с суффиксом 1#. Примечание: на этом шаге я ничего особенного не сделал. Сразу после нажатия "Make Object Id" обе строки обновляются для отображения суффикса 1#, поскольку они ссылаются на один и тот же экземпляр.
Шаг 3 - Смотрите их в любое время, добавив 1# в окно просмотра
В проектах C#, если щелкнуть правой кнопкой мыши имя переменной в одном из окон переменных и выбрать "создать идентификатор объекта", Visual Studio назначит уникальный идентификатор этому экземпляру и отобразит его в столбце "Значение". Идентификаторы выглядят как {1#}, {2#} и т. Д. Если два объекта имеют одинаковые идентификаторы, то они идентичны.
В коде или в окне Immediate вы также можете проверить, идентичны ли два объекта, используя Object.ReferenceEquals().
Я не верю, что есть хороший способ получить фактический адрес памяти для объекта в отладчике. Я предполагаю, что это сделано специально, поскольку расположение объекта в памяти может измениться во время сбора мусора в управляемом приложении. Конечно, вы можете объявить небезопасный блок, закрепить объект и получить указатель на него, используя все обычные операторы C/C++. Тогда вы сможете увидеть значение указателя в отладчике. Однако я не рекомендую это как хорошую привычку - закрепление объектов имеет тенденцию портить способность сборщика мусора поддерживать упорядоченную кучу, что, в свою очередь, может привести к ухудшению производительности и потребления памяти.
Вы можете использовать Immediate Window и использовать Object.ReferenceEquals(obj1, obj2), чтобы проверить это!
Я думаю, что вы хотите функцию System.Object.ReferenceEquals.