문제

는 경우.NET 는 가비지 컬렉션이 있는 이유는 무엇을 명시적으로 호출 IDisposable?

도움이 되었습니까?

해결책

쓰레기 수집은 메모리를위한 것입니다. 비 메모리 리소스 - 파일 핸들, 소켓, GDI+ 핸들, 데이터베이스 연결 등을 폐기해야합니다. IDisposable 실제 핸들은 일련의 참조 체인에서 꽤 먼 길이 될 수 있지만 유형. 예를 들어, 당신은 할 수 있습니다 Dispose an XmlWriter 이는 a를 처분합니다 StreamWriter 그것은에 대한 참조를 가지고 있으며, 그것은 그것을 처분합니다 FileStream 그것 파일 핸들 자체를 공개하는 참조가 있습니다.

다른 팁

확대에 약간 다른 코멘트:

폐기()메소드를 호출해야에 있는 모든 개체에 대한 참조는 유엔 관리 리소스입니다.예제의 것 같은 파일을 포함 스트림 데이터베이스 연결 etc.기본적인 규칙이 작동되는 대부분의 시간입니다:"경우.NET 개체를 구현하 IDisposable 해야 합 Dispose()를 호출할 때 함께 할 수 있 개체입니다.

그러나,다른 어떤 것들을 명심하십시오:

  • 전화 처분하지 않을 제어할 때는 객체가 실제로 파괴되고 메모리를 발표했다.GC 처리는 우리가 그것보다 더 나은 우리가 할 수 있습니다.
  • 폐기 최고 네이티브 리소스,모든 방법은 아래로 스택의 기본 클래스가 존로 표시됩니다.그런 다음 SuppressFinalize()음을 나타내는 객체를 할 준비가되어 확보와 더 추가 작업이 필요합니다.다음의 실행 GC 것입니다.
  • 는 경우 폐기지 않은이라고,다음 GC 를 찾 객체를 청소하지만,마무리해야 합 라는 먼저 확인하기 위하여,리소스가 출시되는 요청을 마무리 대기와 GC 의 움직임에서,그래서 그의 부족을 호출하는 폐기 힘이 하나 더 GC 을 실행하기 전에 객체를 청소될 수 있습니다.이 발생할 객체를 추진하여 다음"세대"GC.이처럼 보이지 않을 수도 있습니다 큰 문제이지만,메모리에 압력을 가하는 응용 프로그램을 추진체는 최대 높은 세대의 GC 밀 수 있는 고 메모리 응용 프로그램을 통해 벽을 밖의 메모리 응용 프로그램.
  • 를 구현하지 않 IDisposable 에서 당신의 자신의 개체지 않는 한 당신이 절대적으로 필요합니다.제대로 구현되지 않았거나 불필요한 구현할 수 있는 실제로 더 나쁜 일을 대신 더 좋다.몇 가지 좋은 지침을 여기에서 찾을 수 있습니다:

    을 구현하는 폐기하는 방법

    거나 읽는 전체 섹션의 MSDN 에서 가비지 컬렉션

객체는 언젠가 메모리 옆에 자원을 보유하기 때문입니다. GC는 메모리를 공개합니다. idisposable은 다른 것을 출시 할 수 있습니다.

당신이 원하기 때문에 제어할 때 사용되고 있는 리소스를 통해 귀하의 개체을 얻을 수 있습니다.

시,GC,작동 하지만 그렇게 할 때 그것은 같은 느낌,그리고 심지어 다음,finalisers 추가하는 객체를 얻을 것이라고 후 2GC 컬렉션이 있습니다.때때로,당신은 청소하려면 해당 개체를 즉시 표시합니다.

이 때 IDisposable 이 사용됩니다.를 호출하여 처분()명시적으로(또는 사용 thr 구문 설탕의를 사용하여 블록)당신은에 액세스 할 수 있습니다 당신의 개체가 깨끗한 자체 표준 방식으로(즉,당신을 구현한 당신의 자신의 정리()호출이라는 명시적으로 대신)

예를 자원하고 싶을 정 즉시습니다:데이터베이스의 처리,파일 처리,네트워크 처리합니다.

사용 키워드를 사용하려면 객체가 idisposable을 구현해야합니다. http://msdn.microsoft.com/en-us/library/yh598w02(vs.71).aspx

그만큼 IDisposable 인터페이스는 종종 리소스 측면에서 설명되지만 대부분의 그러한 설명은 "자원"이 실제로 무엇을 의미하는지 실제로 고려하지 못합니다.

일부 물체는 외부 엔티티에게 추가 통지가있을 때까지 자신을 대신하여 다른 실체의 손해를 입히도록 요청해야합니다. 예를 들어, 파일 스트림을 포괄하는 객체는 파일 시스템 (연결된 우주의 어느 곳에는) 파일에 대한 독점 액세스 권한을 부여하도록 요청해야 할 수도 있습니다. 대부분의 경우 외부 엔티티에 대한 객체의 요구는 외부 코드의 객체에 대한 요구와 관련이 있습니다. 클라이언트 코드가 위에서 언급 한 파일 스트림 객체와 관련하여 모든 작업을 수행하면 해당 객체가 더 이상 관련 파일에 대한 독점 액세스 (또는 해당 문제에 대한 액세스)를 가질 필요가 없습니다.

일반적으로, 추가 통지가 그러한 통지를 전달할 의무가 발생할 때까지 엔티티가 무언가를하도록 요구하는 객체 X는 X의 클라이언트가 X의 서비스가 필요할 수있는 한 그러한 통지를 전달할 수 없습니다. 목적 IDisposable 객체에 서비스가 더 이상 필요하지 않다는 것을 알리는 통일 방법을 제공하는 것입니다. 그들의 서비스는 더 이상 필요하지 않습니다. 호출하는 코드 IDisposable 그 이후로 객체가 외부 엔티티로부터 요청한 서비스에 대해 알거나 신경 쓰지 않아도됩니다. IDisposable 외부 엔티티에 의무 (있는 경우)의 의무를 이행하도록 대상을 초대합니다.

"자원"의 관점에서 물건을 넣으려면, 객체는 외부 엔티티가 추가 통지 할 때까지 (일반적으로 배타적 인 사용을 부여하는 것은 아니지만) 외부 엔티티에게 무언가를 요구할 때 자원을 획득하고, 자원을 공개 할 때 자원을 획득 할 때 자원을 획득합니다. 외부 엔티티의 서비스는 더 이상 필요하지 않다고 말합니다. 자원을 얻는 코드는 의무가 발생하는 한 "사물"을 얻지 못합니다. 자원을 공개한다고해서 "사물"을 포기하지는 않지만 대신 의무가 이행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top