내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Object.Finalize 메서드

2013-12-13

가비지 수집기에서 Object를 회수하기 전에 개체가 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다.

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

protected virtual void Finalize()

Finalize 메서드는 현재 개체를 삭제하기 전에 현재 개체에서 보유하고 있는 관리되는 리소스에서 정리 작업을 수행하는 데 사용됩니다. 이 메서드는 보호되었기 때문에 이 클래스 또는 파생 클래스를 통해서만 액세스할 수 있습니다.

GC.SuppressFinalize를 호출했지만 개체가 종료에서 제외되지 않은 경우, 이 메서드는 해당 개체에 액세스할 수 없게 되었을 때 자동으로 호출됩니다. 응용프로그램 도메인이 종료되는 동안 아직 액세스 가능한 개체를 포함하여 종료에 대한 예외로 지정되지 않은 개체에 대해 Finalize가 자동으로 호출됩니다. ReRegisterForFinalize 등의 방법으로 개체가 다시 등록되었거나 GC.SuppressFinalize가 호출되지 않은 경우를 제외하고는 Finalize는 특정 인스턴스에 대해 한 번만 자동으로 호출됩니다.

파생 형식에서의 Finalize 구현은 해당 기본 형식의 Finalize 구현을 호출해야 합니다. 이 경우에만 응용프로그램 코드에서 Finalize를 호출할 수 있습니다.

참고참고:

C# 컴파일러에서는 Finalize 메서드를 직접 구현할 수 없으므로 C# 소멸자는 해당 기본 클래스의 소멸자를 자동으로 호출합니다.

Finalize 작업은 다음과 같이 제한됩니다.

  • 가비지가 수집될 때 종료자가 실행되는 시간은 정의되어 있지 않습니다. Close 메서드나 Dispose 메서드를 호출했을 때만 특정 시간에 리소스가 해제됩니다.

  • 한 개체가 다른 개체를 참조하는 경우에도 두 개체의 종료자가 실행되는 순서는 지정되어 있지 않습니다. 다시 말해, 개체 A가 개체 B를 참조하고 두 개체 모두 종료자를 가졌다면, 개체 A의 종료자가 시작될 때 개체 B가 이미 종료되었을 수 있습니다.

  • 종료자가 실행되는 스레드도 지정되어 있지 않습니다.

다음과 같은 예외적인 경우에는 Finalize 메서드가 완전하게 실행되지 않거나 아예 실행되지 않을 수 있습니다.

  • 다른 종료자에서 무한 루프를 실행하거나 잠글 수 없는 경우에도 계속 시도하여 무기한 차단하는 경우. 런타임에서는 종료자를 완전히 종료하려고 하기 때문에 한 종료자가 프로세스를 무기한 차단하면 다른 종료자가 호출되지 않을 수 있습니다.

  • 런타임에서 정리할 시간 없이 프로세스가 종료되는 경우. 이때 런타임에서 프로세스 종료에 대해 보내는 첫 번째 알림은 DLL_PROCESS_DETACH 알림입니다.

런타임에서는 종료할 개체 수가 줄어드는 경우에만 개체를 계속 Finalize합니다.

Finalize 또는 Finalize의 재정의에서 예외를 발생하고 기본 정책을 재정의하는 응용프로그램에서 런타임을 호스팅하지 않으면 런타임에서 프로세스를 종료하고 활성화된 try-finally 블록이나 종료자가 실행되지 않습니다. 따라서 종료자가 리소스를 해제하거나 소멸시킬 수 없는 경우 프로세스 무결성이 보장됩니다.

구현자 참고 사항

Object.Finalize는 기본적으로 아무것도 수행하지 않습니다. Finalize 작업을 실행하는 경우에는 가비지를 수집하는 동안 회수하는 데 시간이 더 오래 걸리기 때문에 필요한 경우에만 파생 클래스에서 재정의해야 합니다.

Object에서 다른 리소스를 참조하는 경우에는 파생 클래스에서 Finalize를 재정의하여 가비지를 수집하는 동안 Object가 삭제되기 전에, 참조되는 리소스를 해제해야 합니다.

파일 핸들 또는 데이터베이스 연결과 같이 관리되지 않는 리소스는 이들 리소스를 사용하는 관리되는 개체가 회수될 때 해제되어야 하는데, 이러한 리소스를 사용하는 형식은 Finalize를 구현해야 합니다.

Finalize는 가비지를 수집하는 동안 개체가 정리된 상황에서도 개체를 되살려 액세스가 가능하도록 만드는 등 여러 가지 작업을 수행할 수 있습니다. 그러나 개체는 한 번만 되살릴 수 있으며 Finalize는 가비지를 수집하는 동안에는 되살린 개체에 대해 호출될 수 없습니다.

[C#]

C#에서는 소멸자를 사용하여 정리 작업을 수행합니다. 소멸자는 기본 형식의 소멸자를 자동으로 호출하는 등의 적절한 보호 수단을 제공합니다. C# 코드에서는 Object.Finalize를 호출하거나 재정의할 수 없습니다.

다음 예제는 Finalize를 재정의하는 개체가 삭제될 경우 Finalize 메서드가 호출됨을 확인합니다. 프로덕션 응용프로그램에서 개체가 보유하는 관리되지 않는 리소스를 해제하려면 Finalize 메서드를 재정의해야 할 수 있습니다. 또한 C# 예제에서는 Finalize 메서드를 재정의하는 대신 소멸자를 제공합니다.

Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시:
© 2015 Microsoft