Как определить ссылочное равенство двух переменных в разных областях?

предположим, вы отлаживаете. В какой-то момент Вы находитесь в методе A, который имеет параметр foo типа Foo. Позже вы находитесь в методе B, который также принимает параметр foo типа Foo.

эти две переменные вполне могут быть одинаковыми Foo экземпляра, но как вы говорите? Поскольку они находятся в другой области, вы не можете вызвать ReferenceEquals(). Есть ли способ получить фактическое местоположение памяти, на которое указывают переменные, чтобы вы могли сказать, являются ли они экземпляра?

4 ответов


Я верю, что вы можете использовать Make Object ID характеристика. Более подробную информацию об этом можно найти здесь, но подведем итог:

  1. установите точку останова в коде, где вы можете получить объектную переменную, которая находится в области.
  2. запустите код и пусть он остановится в точке останова.
  3. в окне Locals или Autos щелкните правой кнопкой мыши переменную object (обратите внимание на столбец Value) и выберите "Make Object ID" в контекстном меню.
  4. вы теперь должны см. новый идентификационный номер ( # ) в столбце Значение.

после того, как вы" пометите " объект, вы увидите назначенный идентификатор во втором вызове Foo.


находясь в отладчике, вы можете сохранить ссылку на объект в первом методе на статическое поле, а затем сравнить переменную во втором методе со статическим полем.


ну, вы можете получить указатель на свою переменную, но это требует запуска в небезопасном блоке.

после того, как вы "unsafed" вы можете объявить указатель на фу такой:

Foo* p = &myFoo;

это уже обсуждалось здесь в так:

C# адрес памяти и переменная


как развитие предложения Марка Сидаде, когда внутри первого метода введите следующее в ближайшее окно:

var whatever = foo;

затем, когда во втором методе, введите следующее:

bool test = object.ReferenceEquals(whatever, foo);

немедленное окно отобразит результат теста.

однако, предложение CodeNaked лучше.