2009-09-17 2 views

답변

2

System.String (C#의 string)은 참조 유형이므로 WeakReference과 완벽하게 일치하지 않아야하는 이유는 없습니다. 어떤 점에서는 특별한 참조 유형이라는 사실을 무시하십시오 (처음에는 변경할 수 없음). CLR은 이것을 참조 유형으로 간주합니다.

이렇게 말하면 this other StackOverflow thread은 많은 상황에서 문자열 참조가 '인턴 될'수 있다는 점을 잘 보여주기 때문에 가비지 수집과 관련하여 "예상되는"동작은 관찰되지 않습니다.

+0

그건 내 첫 번째 생각 이었지만 사실입니까? 이 질문도 참조하십시오 : http://stackoverflow.com/questions/208387/weakreference-bug – Razzie

+0

@ Razzie : 이것은 GC가 문자열을 사용하는 방법에 대한 암시 일뿐입니다. – Noldorin

1

System.String은 단순한 참조 형식이므로 아무 문제없이 WeakReference와 함께 확실히 작동합니다. WeakReference의 "일반적인"사용에 적합하지 않으므로 WeakReference 사용에 대한 사용 사례를 보는 것이 흥미로울 것입니다. MSDN Guidelines에서

:

를 사용하여 긴 약한 참조하는 경우에만 오브젝트의 상태가 종결 후 예측할 필요.

작은 개체에 약한 참조를 사용하지 마십시오. 포인터 자체가 커서 크기가 클 수도 있고 커질 수도 있습니다.

메모리 관리 문제에 대한 자동 해결 방법으로 약한 참조를 사용하지 마십시오. 대신 응용 프로그램의 객체를 처리하기위한 효과적인 캐싱 정책을 개발하십시오.

+0

저는 많은 문자열을 가지고 있습니다. 일반적으로 DB에 저장되어 있으며 메모리가 부족한 경우에만 해제하려고합니다. 사실 더 나은 캐싱이 좋겠지 만 메모리가 부족할 때 캐시를 해제하는 좋은 방법을 찾을 수 없습니다. –

+0

가비지 컬렉터가 예상대로 작동하고 응용 프로그램이 실행될 때 문자열에 대한 참조를 정리해야합니다. 이들이 수집되는 것을 보지 못한다면, 나는 당신이 참고 문헌을 붙잡고 있거나 문자열이 구속되고 있다고 생각합니다. –

0

일반적으로 약한 참조를 사용하면 깊이 불변 인 객체, 특히 다른 객체를 참조하지 않는 객체를 가리킬 필요가 없습니다. 데이터가 유용하다면 강력한 참고 자료를 보유해야합니다. 유용하지 않다면 아무런 언급도하지 말아야합니다. WeakReference의 사용은 weak 참조 객체의 유용성이 강력한 참조의 존재를 조건으로하는 경우에만 실제로 적합합니다. 가장 일반적인 경우는 약한 참조가 강한 참조를 통해 읽혀질 객체에 정보를 넣는 데 사용되는 경우입니다. 아무도 그 물건에 담긴 정보를 읽지 않는다면, 작가가 더 이상 그걸 다루지 않아도됩니다.

관련 문제