종료는 최종 가능한 각 개체가 할당될 때 종료 대기열에 배치되어야 하므로 개체의 수명 비용과 기간을 증가시킵니다. 종료자가 호출되지 않은 경우에도 이러한 일이 발생합니다. 이렇게 하면 GC가 개체를 삭제하기 어렵게 만드는 부작용이 있으며, GC가 더 오래 유지될 수 있습니다. .NET 프레임워크가 아닌 코드에서 dispose를 호출하면 이 클래스에 대한 종료자를 표시하지 않습니다. 위의 클래스는 래퍼 클래스의 예입니다. 클래스는 SQL 데이터베이스에서 일부 작업을 수행합니다. 이전 예제에서는 SafeFileHandle 개체를 사용하여 패턴을 설명합니다. 대신 SafeHandle에서 파생된 모든 개체를 사용할 수 있습니다. 이 예제에서는 SafeFileHandle 개체를 제대로 인스턴스화하지 않습니다. IDisposable 인터페이스와 추가 Dispose(부울) 메서드를 구현하고 Object.Finalize 메서드도 재정의합니다. IDisposable.Dispose 구현이 형식의 소비자에 의해 호출되지 않은 경우 관리되지 않는 리소스가 삭제되도록 Finalize를 재정의해야 합니다.

이전 글머리 기호에서 설명한 권장 기술을 사용하는 경우 System.Runtime.InteropServices.SafeHandle 클래스는 대신 이 작업을 수행합니다. 사용 중인 개체가 IDisposable을 구현하거나 공용 Dispose 메서드를 구현하는 경우 클라이언트는 코드의 범위를 적절하게 지정한 다음 보유한 리소스를 try/finally 블록에 삭제해야 합니다. try/finally 블록이 없으면 호출 메서드로 인해 예외가 throw되는 경우 클라이언트의 Dispose 호출에 도달하지 않습니다. Dispose 호출에서 throw 된 예외를 무시 하지 않아야 합니다. 개체의 Dispose 메서드가 두 번 이상 호출되는 경우 개체는 첫 번째 호출 이후의 모든 호출을 무시해야 합니다. 해당 Dispose 메서드가 여러 번 호출되는 경우 개체는 예외를 throw해서는 안 됩니다. Dispose 이외의 인스턴스 메서드는 리소스가 이미 삭제된 경우 ObjectDisposedException을 throw할 수 있습니다. Dispose가 호출되지 않을 때 리소스를 해제하기 위해 종료자를 구현합니다.

기본적으로 가비지 수집기는 메모리를 회수하기 전에 개체의 종료자를 자동으로 호출합니다. 그러나 Dispose 메서드가 호출된 경우 일반적으로 가비지 수집기가 삭제된 개체의 종료자를 호출할 필요가 없습니다. 자동 종료를 방지하기 위해 Dispose 구현은 GC를 호출할 수 있습니다. 억제 메서드를 완료합니다. 관리되지 않는 리소스를 래핑하는 클래스를 작성하고 올바르게 삭제했습니다. 다음 예제에서는 관리되지 않는 리소스를 캡슐화하기 위해 안전 핸들을 사용하는 기본 클래스인 DisposableStreamResource에 대한 삭제 패턴을 보여 줍니다. 열려 있는 파일을 나타내는 스트림 개체를 래핑하는 SafeFileHandle을 사용하는 일회용 리소스 클래스를 정의합니다. 또한 DisposableResource 메서드에는 파일 스트림의 총 바이트 수를 반환하는 단일 속성인 Size도 포함됩니다. 이 예제에서는 CyclicClassA a 및 CyclicClassB b의 인스턴스가 주어지면 a.cycle = b 및 b.cycle = a의 경우 전이 처리는 일반적으로 무한 루프를 발생시게 됩니다. 위의 예에서는 이러한 순환 루프가 발생하지 않도록 개체의 상태가 먼저 nullout임을 알 수 있습니다.

스레드 안전 정리 코드 제공 유형이 스레드 안전인 경우에만 – 형식이 스레드에서 안전한 경우 정리 코드도 스레드가 안전한지 확인합니다. 예를 들어 스레드 안전 형식이 리소스를 정리하기 위해 닫기 및 삭제 메서드를 모두 제공하는 경우 닫기 및 Dispose를 동시에 호출하는 스레드를 동기화해야 합니다.

2010 © Copyright Fundacja Projekt Kultura