Как определить ссылочное равенство двух переменных в разных областях? - PullRequest
7 голосов
/ 02 сентября 2011

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

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

Ответы [ 4 ]

6 голосов
/ 02 сентября 2011

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

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

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

1 голос
/ 02 сентября 2011

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

0 голосов
/ 02 сентября 2011

В качестве продолжения предложения Марка Сидаде, когда он находится внутри первого метода, введите следующее окно:

var whatever = foo;

Затем во втором методе введите следующее:

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

В ближайшем окне отобразится результат теста.

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

0 голосов
/ 02 сентября 2011

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

как только вы "ненадежны", вы можете объявить указатель на свой Foo следующим образом:

Foo* p = &myFoo;

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

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

...