파괴자는 C#에서 거의 사용되지 않아 많은 사람들이 잊어버렸지만, 쓸모가 거의 없고 연구할 가치가 없습니다.
1. 파괴기의 특성:
디스트럭터는 클래스 내에서만 존재할 수 있으며, 구조체로는 존재할 수 없습니다; 디스트럭터는 접근 제어 수정자, 정적 수정자, 추상 수정자, 가상 수정자 등 어떤 수정자를 가질 수 없습니다; 파괴자에는 매개변수가 없으므로 과부하가 발생할 수 없습니다.
2. 파괴자를 호출할 때:
파괴자는 객체가 쓰레기 수집기에 의해 재활용될 때 호출되지만, 쓰레기 수집기는 게으른 특성을 가지고 있습니다. 변수가 범위와 수명을 벗어난 직후 즉시 재활용하지 않고, 적절하다고 판단될 때, 보통 메모리가 부족할 때만 재순환합니다. 예를 들어:
메서드 btn_Click 반환 후에는 de를 종료해야 하지만, destructor는 호출되지 않아 가비지 콜렉터가 이를 재활용하지 않았음을 나타냅니다; 폼을 닫으면 파괴자가 실행되며, 프로그램 종료 시 가비지 수집기가 마지못해 재활용해야 함을 나타냅니다(^-^). 물론, GC.Collect()를 호출해 재활용을 강제로 할 수도 있습니다:
btn1을 클릭하면 de1과 new Demo()가 종료되고 디스트럭터가 호출됩니다. de2는 아직 수명이 만료되지 않았으므로 GC.Collect 메서드가 호출되더라도 재활용되지 않습니다; btn1_Click가 돌아오면 de2는 수명이 만료되었지만, 쓰레기 수집기의 게으름으로 인해 여전히 재활용되지 않습니다; btn2가 GC.Collect 메서드를 호출할 때까지 de2가 회수되고 그 파괴자가 호출됩니다.
디스트럭터 호출을 방지하는 한 가지 방법은 고유한 메서드인 Dispose()를 정의한 IDisposable 인터페이스를 구현하는 것입니다. 이렇게 하면 디스트럭터가 내부적으로 호출되는 것을 방지하여, 만약 지루할 때 GC.SuppressFinalize(^-^)를 호출하지 않고도 이 인터페이스를 구현할 수 있습니다. GC는 디스트럭터를 차단하지 않으므로 의미가 없습니다:
이제 de1의 파괴자는 호출되지 않습니다.
3. 파괴자의 본질:
디스트럭터는 본질적으로 다음과 같은 형태를 취하는 방법입니다:
보통 우리는 디스트럭터를 프로그래머가 직접 부르지 못하고 시스템 자체에서만 호출할 수 있다고 생각하지만, 이는 완전히 사실이 아니며, 디스트럭터는 명시적으로 호출할 수도 있습니다. 결국 디스트럭터는 단지 하나의 메서드일 뿐입니다:
파괴자는 클래스 내에서 관리되지 않은 자원이 열리지 않는 한 필요하지 않습니다
|