Development Tip

정적 소멸자

yourdevel 2020. 11. 12. 20:27
반응형

정적 소멸자


C #에는 일부 초기화를 수행하는 정적 생성자가 있습니다. (관리되지 않는 리소스 초기화를 할 수 있습니다) 정적 destuctor가 있는지 궁금합니다.


아니, 없습니다.

정적 소멸자는 프로세스 실행이 끝날 때 실행됩니다. 프로세스가 종료되면 이와 관련된 모든 메모리 / 핸들이 운영 체제에 의해 해제됩니다.

프로그램이 실행이 끝날 때 특정 작업 (예 : 트랜잭션 데이터베이스 엔진, 캐시 플러시)을 수행해야하는 경우 정상적인 실행이 끝날 때 실행되는 코드보다 올바르게 처리하기가 훨씬 더 어려울 것입니다. 과정. 충돌 및 예기치 않은 프로세스 종료를 수동으로 처리하고 어쨌든 다음 실행시 복구를 시도해야합니다. "정적 소멸자"개념은 그다지 도움이되지 않습니다.


정확히 소멸자는 아니지만 다음과 같이 할 수 있습니다.

class StaticClass 
{
   static StaticClass() {
       AppDomain.CurrentDomain.ProcessExit +=
           StaticClass_Dtor;
   }

   static void StaticClass_Dtor(object sender, EventArgs e) {
        // clean it up
   }
}

이것이 가장 좋은 방법입니다 (ref : https://stackoverflow.com/a/256278/372666 )

public static class Foo
{
    private static readonly Destructor Finalise = new Destructor();

    static Foo()
    {
        // One time only constructor.
    }

    private sealed class Destructor
    {
        ~Destructor()
        {
            // One time only destructor.
        }
    }
}

아니, 없습니다. 당신이 할 수있는 가장 가까운 것은에 이벤트 핸들러 설정되어 DomainUnload온 이벤트를 AppDomain하고 거기 정리 작업을 수행합니다.


정적 구현에서 관리되지 않는 리소스를 초기화하고 정리하는 것은 매우 문제가 많고 문제가 발생하기 쉽습니다.

싱글 톤을 사용하지 않고 Finalizer인스턴스에 대해 구현 (이상적으로는에서 상 속됨 SafeHandle)


정적 클래스에 대한 소멸자와 같은 것은 없지만 Appdomain.Unloaded정말로 무언가를해야하는 경우 이벤트 를 사용할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/4364665/static-destructor

반응형