익명 변수에 대한 처분이 호출됩니까?
-
03-07-2019 - |
문제
예를 들어,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
사용 블록 사용, 사용 블록을 사용하는 명백한 방법, Dispose ()를 호출하는 명백한 방법이 없습니다. 물론 관리되지 않는 ResourceusingMemorySuckingPig는 idisposable을 구현합니다.
해결책
해당 클래스의 최종화기가 호출되는 경우 Dispose()
, 예. 그렇지 않다면, 아니요.
(편집하다) 일부 추가 정보:
처분이 호출 될 것이라고 가정하지 마십시오. 유형이 소유 한 관리되지 않은 리소스는 처분되지 않은 경우 최종 방법으로 릴리스되어야합니다.
편집하다
위의 편집을 명확히하기 위해, 나는 많은 사람들 (이 스레드에서 SO, 그리고 다른 곳에서)을 보았습니다. "GC가 전화 할 것입니다. Dispose()
객체가 제거 될 때. "이것은 전혀 그렇지 않습니다. 예, 구성 요소를 작성하는 좋은 방어 코더는 Dispose()
명시 적으로 부름을받지 않으며 결승전에서 그렇게합니다. 그러나 구성 요소를 사용하는 양호하고 방어적인 코더는 Finalizer가 호출하지 않는다고 가정해야합니다. Dispose()
. 자동 호출이 없습니다 Dispose()
쓰레기 수집가에서. 이 기능은 Finalizer가 호출하는 경우에만 해당됩니다. Dispose()
.
다른 팁
나는 그렇게 믿지 않는다. 당신은 다음을 작성해야합니다.
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
파이널 라이저 (Destructor)가있는 경우에만 호출 될 수 있습니다. 최종화기가 호출 할 수 있습니다 Dispose()
그러나 일반적인 구현은 최종화기와 Dispose()
전화 protected Dispose(bool)
.
다시 말해, 그것은의 이행에 달려 있습니다. UnmanagedResourceUsingMemorySuckingPig
, 가이드 라인을 따르는 경우 익명 객체가 정리되지만 using
차단하다.
그러나 GC는 결국 객체를 수집하여 최종화 가능하다는 것을 알게되며 (최종화 가능합니까?) 마무리 할 것입니다. 처분은 자원을 결정적으로 정리하는 것입니다.