7

디버깅 중이라고 가정 해 봅시다. 어떤 시점에서 당신은 Foo 유형의 매개 변수 foo를 가진 방법 A에 있습니다. 나중에 메소드 B에 들어가고, Foo 유형의 매개 변수 foo도 사용합니다.서로 다른 범위에서 두 변수의 참조 평등을 결정하는 방법은 무엇입니까?

이 두 변수는 동일한 Foo 인스턴스 일 수 있지만 어떻게 나타 납니까? 서로 다른 범위에 있기 때문에 ReferenceEquals()으로 전화 할 수 없습니다. 변수가 가리키는 실제 메모리 위치를 얻을 수있는 방법이 있습니까? 그렇다면이 변수가 인스턴스인지 여부를 알 수 있습니까?

답변

6

나는 당신이 할 수있는 생각 Make Object ID 기능을 사용하십시오. 이에 대한 자세한 내용은 here을 발견 할 수 있지만 요약 :

  1. 설정이 범위에 개체 변수에 얻을 수있는 코드에서 중단 점을.
  2. 코드를 실행하고 브레이크 포인트에서 멈추게하십시오.
  3. 지역 또는 자동차 창에서 개체 변수 (값 열에 유의)를 마우스 오른쪽 단추로 클릭하고 컨텍스트 메뉴에서 "개체 ID 만들기"를 선택하십시오.
  4. 값 열에 새 ID 번호 (#)가 새로 표시됩니다.

개체를 "표시"하면 Foo에 대한 두 번째 호출에서 할당 된 ID가 표시됩니다.

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

var whatever = foo; 

그런 경우 두 번째 방법에서, 다음을 입력 : 첫 번째 방법 안에 직접 실행 창에 다음을 입력 마크시다의 제안의 개발로

+0

아주 좋습니다. 이전 버전의 VS에서 사용 가능합니까 아니면 새로운 것입니까? – Chris

+0

@Chris - 저는 VS2008이 지금 당장은 없지만, 2008 년과 2010 년에 지원된다고 말합니다. VS2010에서 이것을 확인했습니다. – CodeNaked

+0

예, 죄송합니다. 나는 단지 내가 물었을 때 그것을 알아 차렸다. :( – Chris

1

디버거에서 첫 번째 메서드의 개체에 대한 참조를 정적 필드에 저장 한 다음 두 번째 메서드의 변수를 정적 필드와 비교할 수 있습니다.

+1

제안 해 주셔서 감사합니다. 값을 받기 위해 디버깅하기 전에 코드에 정적 필드를 만들어야한다는 것을 의미합니까? 어쩌면 약간의 개입이 ... – David

+0

예, 그렇게해야 할 것입니다. –

0

변수에 대한 포인터를 얻을 수는 있지만 안전하지 않은 블록에서 실행해야합니다.

Foo* p = &myFoo; 

이 아직 여기에서 논의하고있다 : 당신은 당신이이처럼 푸에 대한 포인터를 선언 할 수있다 "unsafed"일단

C# memory address and variable

0

직접 실행 창에 테스트 결과가 표시됩니다.

그러나 CodeNaked의 제안이 더 좋습니다.

관련 문제