Отладка VS 2015: как узнать, имеют ли две объектные переменные одинаковую ссылку на объект?

как узнать во время отладки, ссылаются ли obj и obj2 на один и тот же объект в следующем коде?

object obj = new object();
object obj2 = new object();
obj2 = obj;

В VS 2008 я мог легко увидеть это, заглянув в окно наблюдения или окно локальных переменных или во всплывающую подсказку значения переменной, потому что все они показывали адрес объекта, что было действительно полезно (пример кода — C++/CLI, но он был протестирован в С# тоже):

введите здесь описание изображения

Но в VS 2015 – нет. Как я могу получить эту информацию здесь?


person Tobias Knauss    schedule 12.06.2017    source источник
comment
Я использую для этого GetHashCode(), 2 разных экземпляра обычно дают разные хэш-коды, но это может быть сложно.   -  person 3615    schedule 12.06.2017
comment
@ 3615: небезопасно. Экземпляры могут быть разными, но содержать одни и те же данные.   -  person Tobias Knauss    schedule 12.06.2017
comment
Все, что вам нужно сделать, это использовать стандартный механизм проверки на ссылочное равенство (идентичность объекта). Подробности см. в отмеченном дубликате. Используйте непосредственное окно, чтобы сделать фактический вызов, передав две ссылки, которые вы хотите проверить.   -  person Peter Duniho    schedule 12.06.2017
comment
@PeterDuniho Это еще более трудоемко. Я предпочитаю решение, которое я нашел сам и разместил ниже. Кроме того, дубликат сообщения — это все, что угодно, только не дубликат! Если вы хотите пометить мой вопрос как дубликат, воспользуйтесь ссылкой, которую я дал в своем ответе!   -  person Tobias Knauss    schedule 12.06.2017
comment
используйте ссылку, которую я дал в своем ответе! -- я сделал. Но ваш вопрос также является дубликатом другого: то есть вы хотите знать, как проверить, равны ли две ссылки. На это точно ответил и первый. Если у вас есть какие-то дополнительные критерии, которые заставляют вас полагать, что совершенно хорошие ответы неадекватны, вы должны ясно указать это в своем вопросе. Ничто в вашем вопросе не говорит ни о чем, кроме желания определить эталонное равенство.   -  person Peter Duniho    schedule 12.06.2017
comment
Просто держите окно отладки Debug › Windows › Memory › Memory 1 под рукой. Он показывает адрес.   -  person Hans Passant    schedule 12.06.2017
comment
Я понимаю вашу боль, я также хотел бы, чтобы было проще просто сразу увидеть уникальный адрес объекта. До сих пор самый простой способ, который я нашел, - это просто добавить наблюдение для всех объектов, которые мне интересны для проверки, а затем добавить идентификатор объекта из меню наблюдения.   -  person Shahin Dohan    schedule 02.12.2020


Ответы (1)


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

person Tobias Knauss    schedule 12.06.2017
comment
Я не понимаю, как создание идентификатора объекта является обходным путем. Как только вы сделаете идентификатор объекта, вы сразу же увидите необходимую информацию, как и хотите. Я отмечаю, что в найденном вами сообщении даже упоминается, что вы можете просто вызвать object.ReferenceEquals() в непосредственном окне, точно так же, как вы делаете это в любое время, когда хотите проверить равенство ссылок в коде. Так что есть и такой вариант. - person Peter Duniho; 12.06.2017