앱에서 만드는 대부분의 개체의 경우 .NET 가비지 수집 기를 사용하여 메모리 관리를 처리할 수 있습니다. 그러나 관리되지 않는 리소스를 포함하는 개체를 만드는 경우 해당 리소스 사용을 완료할 때 해당 리소스를 명시적으로 해제 해야 합니다 . 관리되지 않는 리소스의 가장 일반적인 유형은 파일, 창, 네트워크 연결 또는 데이터베이스 연결과 같은 운영 체제 리소스를 래핑하는 개체입니다. 가비지 수집기는 관리되지 않는 리소스를 캡슐화하는 개체의 수명을 추적할 수 있지만 관리되지 않는 리소스를 해제하고 정리하는 방법을 모릅니다.
형식에서 관리되지 않는 리소스를 사용하는 경우 다음을 수행해야 합니다.
삭제 패턴을 구현합니다. 이렇게 하려면 관리되지 않는 리소스의 결정적 릴리스를 사용하도록 설정하는 구현을 제공해야 IDisposable.Dispose 합니다. 개체(및 사용하는 리소스)가 더 이상 필요하지 않을 때 형식의 소비자가 호출 Dispose 합니다. 메서드는 Dispose 관리되지 않는 리소스를 즉시 해제합니다.
소비자가 Dispose을 호출하는 것을 잊었을 경우, 관리되지 않는 리소스를 해제할 수 있는 방법을 제공하세요. 이 작업을 수행하는 방법에는 두 가지가 있습니다.
안전한 핸들을 사용하여 비관리 리소스를 감쌉니다. 권장되는 기술입니다. 안전 핸들은 추상 클래스에서 System.Runtime.InteropServices.SafeHandle 파생되며 강력한 Finalize 메서드를 포함합니다. 안전 핸들을 사용할 때에는 IDisposable 인터페이스를 구현하고, Dispose 구현에서 안전 핸들의 IDisposable.Dispose 메서드를 호출하기만 하면 됩니다. 안전한 핸들의 파이널라이저는 Dispose 메서드가 호출되지 않으면 가비지 수집기에 의해 자동으로 호출됩니다.
-또는—
종료자 정의하기. 종료를 사용하면 형식의 소비자가 결정적으로 삭제를 호출 IDisposable.Dispose 하지 못할 때 관리되지 않는 리소스를 비결정적으로 해제할 수 있습니다.
경고
개체 종료는 복잡하고 오류가 발생하기 쉬운 작업일 수 있습니다. 자체 종료자를 제공하는 대신 안전한 핸들을 사용하는 것이 좋습니다.
귀하의 형식의 소비자는 IDisposable.Dispose 구현을 직접 호출하여 관리되지 않는 리소스에서 사용하는 메모리를 해제할 수 있습니다. 메서드를 Dispose 올바르게 구현하면, 안전한 핸들의 Finalize 메서드 또는 사용자가 재정의한 Object.Finalize 메서드가 Dispose 메서드가 호출되지 않았을 경우 리소스를 정리하기 위한 안전 장치 역할을 합니다.
이 부분에서는
Dispose 메서드를 구현하면 관리되지 않는 리소스를 해제하기 위한 삭제 패턴을 구현하는 방법을 설명합니다.
구현IDisposable
하는 개체 사용 은 소비자가 특정 구현을 호출하도록 하는 방법을 설명합니다. 이 작업을 수행하려면 C# using
(또는 Visual Basic Using
) 문을 사용하는 것이 좋습니다.
참고 문헌
형식/멤버 | 설명 |
---|---|
System.IDisposable | Dispose 관리되지 않는 리소스를 해제하는 메서드를 정의합니다. |
Object.Finalize | 관리되지 않는 리소스가 Dispose 메서드에 의해 해제되지 않는 경우 개체를 종료할 수 있도록 합니다. |
GC.SuppressFinalize | 종료 처리를 억제합니다. 이 메서드는 Dispose 메서드에서 관례적으로 호출되어 종료자가 실행되지 않도록 합니다. |
.NET