본문 바로가기
카테고리 없음

GC.SuppressFinalize(this);

by 공부봇 2025. 9. 4.
반응형

짧게 말해: 이 객체에 파이널라이저(종종 ~Basler() 형태)가 실행될 필요가 없도록 GC에 “알려서” 불필요한 비용과 이중 해제를 막기 위해 씁니다.

좀 더 자세히:

  • **파이널라이저(Finalizer)**가 있는 객체는 GC가 바로 치우지 않고 Finalization Queue에 올린 뒤, 별도 스레드에서 파이널라이저를 호출합니다.
  • 우리가 Dispose()에서 이미 모든 정리를 끝냈다면, 파이널라이저는 더 이상 할 일이 없고 오히려 성능만 떨어뜨리거나(추가 단계) 이중 해제 위험이 생길 수 있어요.
  • GC.SuppressFinalize(this)는 “이 객체는 이미 깔끔히 정리됐으니 파이널라이저를 호출하지 마”라고 GC에게 표시하는 호출입니다. 즉, 파이널라이저 큐에서 제거합니다.

그럼 우리 코드에서 꼭 필요해?

  • 현재 클래스는 파이널라이저가 없습니다(그리고 sealed라 파생 클래스가 파이널라이저를 추가할 수도 없음).
    실무적으로 필수는 아니지만, 호출해도 무해합니다.
  • 그래도 많이 넣는 이유는 표준 Dispose 패턴을 지키기 위함이에요. 나중에 유지보수 중 파이널라이저를 추가하더라도 Dispose()가 이미 있으면 자동으로 안전해지거든요(이중 정리 방지 + 성능 이점 유지).

정석 Dispose 패턴(참고)

private bool _disposed;

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);  // Dispose(true)로 정리했으니 파이널라이저 생략
}

protected void Dispose(bool disposing)
{
    if (_disposed) return;
    _disposed = true;

    if (disposing)
    {
        // 여기서 관리 리소스 해제 (이벤트 해제, Camera.Dispose 등)
    }
    // 여기서 비관리 리소스 해제 (필요하면)
}

// 만약 파이널라이저를 만든다면:
// ~Basler() { Dispose(false); }

한 줄 정리

  • GC.SuppressFinalize(this) = “이 객체는 이미 사람이 정리했음(Dispose). 더 이상 파이널라이저 부르지 마.”
  • 지금 구조에선 필수는 아니지만 표준/보수성 측면에서 유지해도 좋다가 결론입니다.
반응형