Как определить ссылочное равенство двух переменных в разных областях?
предположим, вы отлаживаете. В какой-то момент Вы находитесь в методе A, который имеет параметр foo типа Foo
. Позже вы находитесь в методе B, который также принимает параметр foo типа Foo
.
эти две переменные вполне могут быть одинаковыми Foo
экземпляра, но как вы говорите? Поскольку они находятся в другой области, вы не можете вызвать ReferenceEquals()
. Есть ли способ получить фактическое местоположение памяти, на которое указывают переменные, чтобы вы могли сказать, являются ли они экземпляра?
4 ответов
Я верю, что вы можете использовать Make Object ID
характеристика. Более подробную информацию об этом можно найти здесь, но подведем итог:
- установите точку останова в коде, где вы можете получить объектную переменную, которая находится в области.
- запустите код и пусть он остановится в точке останова.
- в окне Locals или Autos щелкните правой кнопкой мыши переменную object (обратите внимание на столбец Value) и выберите "Make Object ID" в контекстном меню.
- вы теперь должны см. новый идентификационный номер ( # ) в столбце Значение.
после того, как вы" пометите " объект, вы увидите назначенный идентификатор во втором вызове Foo.
находясь в отладчике, вы можете сохранить ссылку на объект в первом методе на статическое поле, а затем сравнить переменную во втором методе со статическим полем.
ну, вы можете получить указатель на свою переменную, но это требует запуска в небезопасном блоке.
после того, как вы "unsafed" вы можете объявить указатель на фу такой:
Foo* p = &myFoo;
это уже обсуждалось здесь в так:
как развитие предложения Марка Сидаде, когда внутри первого метода введите следующее в ближайшее окно:
var whatever = foo;
затем, когда во втором методе, введите следующее:
bool test = object.ReferenceEquals(whatever, foo);
немедленное окно отобразит результат теста.
однако, предложение CodeNaked лучше.