이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 20506|회답: 1

[출처] C# 딥 다이브 - 디스트럭터

[링크 복사]
게시됨 2018. 8. 17. 오후 1:54:43 | | |
파괴자는 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.        파괴자의 본질:

디스트럭터는 본질적으로 다음과 같은 형태를 취하는 방법입니다:

보통 우리는 디스트럭터를 프로그래머가 직접 부르지 못하고 시스템 자체에서만 호출할 수 있다고 생각하지만, 이는 완전히 사실이 아니며, 디스트럭터는 명시적으로 호출할 수도 있습니다. 결국 디스트럭터는 단지 하나의 메서드일 뿐입니다:

파괴자는 클래스 내에서 관리되지 않은 자원이 열리지 않는 한 필요하지 않습니다





이전의:C# Distinct는 조건부 객체를 중복 제거합니다
다음:예외 메시지: "StrongTypingException: IsPrima...
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com