2012-05-13 3 views
2

Finalize 메서드 오버로드에서 실행되는 코드와 관련된 문제가 최근에 발생했습니다.C에서 메서드 지침 및 모범 사례 완성

저는 메모리 관리/성능과 관련된 문제를 대부분 알고 있지만 "어떤 코드가 Finalize 메서드에 포함되지 않아야합니까?"에 대한 지침이 있는지 여부에 관심이 있습니까? 예를 들어

:

  1. 는 Finalize 메서드 내에서 예외를 던지지 마십시오.
  2. 코드를 빨리 실행해야합니다.
  3. 이벤트를 올리지 마십시오 (?)로 인해 이벤트에 대한 기타
  4. ...

내 경우에는 동작이 보였다는 일부 예외가 원인이 제기되고.

내 질문은 - 어떤 지침을 따라야합니까 (어쩌면 일부 도구를 사용하여 실시해야합니까) finalize 방법에 관한 것입니까?

답변

7

최종화는 만 MSDN

의 Finalize 또는의 Finalize의 재정의가 예외를 throw했을 경우에서 관리되지 않는 리소스

을 제거하기위한 것이며, 런타임은 기본 정책을 무시하는 응용 프로그램에 의해 호스팅되지 않는다 , 런타임은 프로세스를 종료하고 활성 try-finally 블록 또는 종료자를 실행하지 않습니다. 이 동작은 finalizer가 리소스를 해제하거나 소멸 할 수없는 경우 프로세스 무결성을 보장합니다.

의 Finalize 동작은 다음과 같은 제한이

종료 자 가비지 컬렉션시에 실행되는 정확한 시간은 정의되지 않는다. Close 메서드 나 Dispose 메서드를 호출하지 않는 한 특정 시간에 리소스가 해제되지 않을 수 있습니다.

두 개체의 종결자가 특정 개체가 다른 개체를 참조한다고해도 특정 순서로 실행되지 않을 수도 있습니다. 즉, 개체 A에 개체 B에 대한 참조가 있고 둘 다 finalizer가있는 경우 개체 B의 시작자가 시작할 때 개체 B가 이미 완료되었을 수 있습니다. 종료 자이 실행되는

스레드는

2

당신이 마무리 전화하는거야 이유가 없어야 지정되지 않습니다. 재정의를 위해 열려 있지만 최종 사용을 사용하는 가장 좋은 방법은 사용하지 않는 것입니다. 대신 IDisoposable에서 상속받습니다. 이것은 최선의 방법 일뿐 만 아니라 가비지 수집을 방해하지 않으며 자동 처분에 편리한 ''using 절을 사용합니다. 이 클래스를 상속받는 것은 다른 개발자에게 이것이 처분 할 리소스가있는 객체임을 알려주며, 나는 특별한 방법입니다. GC가 가비지를 실행하는 동안 처분을 호출한다고 생각합니다.

요약하면 마무리로 할 수있는 일은 처분으로 더 잘 수행됩니다.

+0

절을 사용하면 좁은 집합의 사례 (일부 개체를 한 번 사용)에 적합하며 모든 사용 사례에 적합하지 않습니다. 그러나 가능한 한 그것을 사용하는 것이 좋습니다 동의합니다. –

+5

가비지 컬렉터 * 결코 * 호출하지 마십시오 Dispose() –

+0

내 실수 @HansPassant 나는 그 인상을 받고있었습니다. 만든 수정. –