최종화기가없는 객체에서 GC.Suppressfinalize를 호출해야합니까?

StackOverflow https://stackoverflow.com/questions/621152

  •  05-07-2019
  •  | 
  •  

문제

몇 가지 이유 fxcop은 생각하는 것 같습니다 파이널 라이저가 있는지 여부에 관계없이 GC.Suppressfinalize를 처분해야합니다.

내가 뭔가를 놓치고 있습니까? 최종화기가 정의되지 않은 객체에서 GC.SuppressFinalize를 호출 해야하는 이유가 있습니까?

도움이 되었습니까?

해결책

IL -System.Object.Finalize ()는 모든 클래스에 존재하므로 항상 최종화기가 있으므로 사용자 정의 클래스를 만드는 경우 최종화 업체가 있습니다. 즉, 모든 객체가 최종 대기열에 놓인 것은 아니므로 자신의 최종화기를 구현할 경우 기술적으로 최종화를 억제해야합니다.

구현하는 경우 IDisposable 관리되지 않는 리소스를 마무리하려면 최종화기가 포함되어야하며 이론적으로는 이론적으로는이 이론에서 이미 정리를하고 있기 때문에이를 실행하는 것을 방지해야합니다. Dispose 호출됩니다.

다른 팁

전화 할 필요가 없습니다 GC.SuppressFinalize(this) 그렇지 않으면 처분하는 경우 :

  • 귀하는 상쾌한 방법을 구현하는 기본 클래스입니다 (다시, 여기에서도 귀하의 책임이 아닐 수도 있지만이 경우에는 그렇게하고 싶을 수도 있습니다).
  • 당신은 직접 파이널 라이저를 가지고 있습니다. 기술적으로 .NET의 모든 클래스에는 최종화기가 있지만 현재 유일하게 최종화기가있는 경우 Object, 그러면 객체는 최종 조정이 필요하지 않으며 GC에서 최종화 목록에 올리지 않습니다.

위의 사례가 없다고 가정하면 해당 메시지를 안전하게 무시할 수 있다고 말합니다.

AC# Destructor를 사용하여 구현하지 않은 경우에도 모든 객체에는 Finalizer 메소드가 있습니다 (실제로 GC에서 호출되지 않음). idisposable을 구현 한 경우 전화를 걸어 다니는 것이 좋습니다. 즉, 마무리를 명시 적으로 수행하기로 결정했기 때문입니다.

Devx 기사

최종화기가 정의되지 않은 경우 suppressfinalize ()를 호출 할 필요가 없습니다. 방어를 원한다면 최종화기와 dispose ()를 갖는 것이 좋을 수 있으므로 항상 dispose ()에 전화하기 위해 클라이언트에 의존 할 필요가 없습니다. 그렇다면 자원이 잊어 버릴 때 자원이 누출되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top