Уникальная идентификация ссылочных типов в отладчике - PullRequest
43 голосов
/ 23 ноября 2010

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

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

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

Есть ли способ для меня, чтобы увидеть такую ​​информацию в C #?Возможно, это какой-то эквивалент оператора & для окна просмотра или что-то подобное?

Ответы [ 4 ]

71 голосов
/ 23 ноября 2010

То, что вы ищете, это идентификатор объекта. Для любого типа ссылки в отладчике вы можете щелкнуть правой кнопкой мыши и сказать «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»

alt text

Шаг 2 - Экземпляры теперь отображаются с суффиксом 1 #. Примечание: на этом этапе я ничего особенного не сделал. Сразу после нажатия «Make Object Id» обе строки обновляются для отображения суффикса 1 #, поскольку они ссылаются на один и тот же экземпляр.

alt text

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

alt text

4 голосов
/ 23 ноября 2010

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

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

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

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

Я думаю, вам нужна функция System.Object.ReferenceEquals .

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

Вы можете использовать Немедленное окно и использовать Object.ReferenceEquals (obj1, obj2) , чтобы проверить это!

...