2013-01-05 2 views
1

쉬운 하나. 나는 검색하려고했지만 기쁨은 없다..NET, 필드가 널인지 여부를 설정하는 방법

A 유형의 개체가 있고 B 유형의 공개 필드 F이 있다고 가정합니다. 나는 B의 인스턴스를 만들고 A.F=B을 설정합니다.

A.F == null의 결과는 거짓입니다. A.F is B의 결과는 True입니다.

하지만 B은 null로 설정됩니다. A.F 속성에는 여전히 이전 인스턴스 B의 핸들이 들어 있습니다. A.F의 런타임 조회는 여전히 B 유형으로 표시됩니다. 따라서 테스트 A.F == null은 여전히 ​​False를 나타내며, A.F is B 테스트는 여전히 True를 제공합니다. B이 휴지통에도 불구하고.

A.F 속성을 검사하여 해당 핸들이 사라진 개체를 가리키는 지 확인하려면 어떻게해야합니까?

답변

8

.NET 참조가 결코 사라진 개체를 가리 키지 않습니다. 이것이 GC의 전체 요점입니다. 당신의 예제는 하나의 객체에 대한 두 개의 별개이지만 동일한 참조를 설명합니다. 하나의 참조를 변경해도 다른 참조는 변경되지 않습니다. 기본적으로 당신이 설명하는 것은 같은 : 그것은되지 않습니다 0으로 obj.Foo을 기대하고 다음

int x = 1; 
obj.Foo = x; 
x = 0; 

: 그리고 당신이 그것을 변경할 때까지이 일을 할 것이다. 참고 문헌은 동일하게 작동합니다.

B의 인스턴스를 "휴지통"하지 않았습니다. 그 경우는 여전히 완벽하게 행복합니다. 방금 하나의 참조를 제거했습니다.

다른 말로 표현하면, 내 페이스 북에 "Donna"를 제 아내로 기재합니다. 내가 지금 그 분야 (내가 할 계획이 없음)를 분명히하면, 나는 그녀의 이야기를 지우지 않았다.

+1

FB 참조 용 :-) – Yahia

+0

소년 나는 어리 석을 느낍니다. 예, 포인터가 아직 남아 있으므로 그대로 유지됩니다. 객체에 대한 모든 포인터를 휴지통에 버릴 수 있습니까? 나는 현재 코드를 사용하고 있으므로 객체 B는 그것에 대한 모든 참조 목록을 유지해야합니다. 그래서 B를 파괴하면 모든 포인터를 없앨 수 있습니다. 즉, B에 대한 참조를 설정할 때마다 B가 해당 참조를 기록 할 수 있도록 B 내부의 메서드를 호출해야합니다. –

+0

@David 아니, 그렇게 할 방법이 없습니다. –

0

A.F == nullFalseA.F 경우는 A.FB null가 아닌 동일한 객체를 참조하는 그리고, B이다. B이 코드의이 시점에서 null이어야한다고 생각하면 이전에 null로 설정했기 때문에 코드에 다른 버그가있을 수 있습니다.

관련 문제