9

문제는 우리가 왜 전화해야하는지입니다.Dispose()어떤 물건에? 가비지 콜렉터가 범위를 벗어날 때 오브젝트를 수집하지 않는 이유는 무엇입니까? 나는 그것이 왜 그렇게 구현되었는지에 대한 이유를 이해하려고 노력하고 있습니다. 내 말은,Dispose()가비지 수집기가 범위 객체에서 수집 될 때 호출되었습니다.

2 답변


20

가비지 컬렉터는 비 결정적입니다.어떤 점에서그들이 더 이상 언급되지 않은 후에는 적시에 일어날 수 있다고 보장하지 않습니다. 순환 적 종속성을 허용하고 카운터 전체를 증가 및 감소시키지 않는 성능 이점을 포함하여 참조 계산에 비해 여러 가지 이점이 있습니다.

그러나, 그것은할까요적시에 (데이터베이스 연결, 파일 핸들 등 - 메모리 이외의 거의 모든 것) 정리할 수 있습니다. 그래도 명시 적으로 리소스를 삭제해야합니다. 그만큼using성명서는 이것을 꽤 쉽게 만듭니다.


  • 잘 나는 비트 맵을 생성하는 응용 프로그램을 가지고 있었고 나는 dispose ()를 호출하지 않았고 응용 프로그램은 기가 바이트의 메모리를 시작했다. 내가 20 초마다 비트 맵을 생성하고 즉시 디스크에 저장하고 범위를 벗어난다. 그러나 가비지 컬렉터는 전혀 작동하지 않는 것 같습니다. 그 기억은 단지 위로 가고 있었기 때문에. - Karim
  • @ 칼림 : 글쎄, 당신은 분명히 그 비트 맵을 버렸을 것입니다. 결국 GC를 수집하지 못한 이유를 진단하기 위해 GC가 어떤 것인지 확인해야하지만 이미지 구현 IDisposable 이유는 다음과 같습니다. - Jon Skeet

7

Dispose는 관리되지 않는 리소스 (예 : 데이터베이스 연결 래퍼, 이전 COM 라이브러리 등)를 정리하는 데 사용됩니다.

편집하다:추가 정보가 담긴 일부 MSDN 링크 :

http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx

http://msdn.microsoft.com/en-us/library/0xy59wtx(VS.71).aspx

가비지 수집기가 개체를 회수 할 때 관리되지 않는 리소스에 어떤 일이 발생하는지 지정하려면 보호 된 Finalize () 메서드를 재정의해야합니다.http://msdn.microsoft.com/en-us/library/system.object.finalize(VS.71).aspx

연결된 질문


관련된 질문

최근 질문