개체가 GC.SuppressFinalize를 호출했는지 여부를 감지하는 방법이 있습니까?개체가 GC.SuppressFinalize를 호출했는지 여부를 감지 할 수 있습니까?
나는이 (명확성을 위해 생략 완전한 폐기 패턴)과 같은 보이는 개체가 다음 ownsResource
생성자 매개 변수가 다음 파이널 라이저는 아무 상관이 없습니다, false
경우
public class ResourceWrapper {
private readonly bool _ownsResource;
private readonly UnmanagedResource _resource;
public ResourceWrapper(UnmanagedResource resource, bool ownsResource) {
_resource = resource;
_ownsResource = ownsResource;
if (!ownsResource)
GC.SuppressFinalize(this);
}
~ResourceWrapper() {
if (_ownsResource)
// clean up the unmanaged resource
}
}
을 - 그래서 합리적인 것처럼 보입니다 (약간 기발한 경우) GC.SuppressFinalize
을 생성자에서 바로 호출하십시오. 그러나이 동작은 기발한 것이기 때문에 XML 문서 주석에 주석을 달아달라고 유혹됩니다. 주석을 달 것을 유혹받는다면 그것을위한 단위 테스트를 작성해야합니다.
그러나 System.GC이 에 방법을 가지고있는 동안 객체의 finalizability (SuppressFinalize, ReRegisterForFinalize)를 설정, 나는 어떤 방법 객체의 finalizability를 얻을 표시되지 않습니다. GC.SuppressFinalize가 Typemock을 사거나 My own CLR 호스트를 작성하지 않은 채 주어진 인스턴스에서 호출되었는지 여부를 쿼리하는 방법이 있습니까?
둘 다 좋은 생각이지만, 나는 두 번째를 좋아한다. "소유주"의 책임을 별도의 물건으로 옮겨라. –
별도의 객체 유형을 사용하면 IMHO가 작동 할 때보다 깨끗하게 처리됩니다. 즉, 자원 작성 시점을 래퍼가 알고 있고 그 상태가 변경되지 않을 것입니다.하지만 좀 더 많은 코드가 필요할 수 있습니다. 두 기술을 모두 사용할 수있는 것은 분명 유용합니다. 위의 편집에서 언급했듯이 finalizers는 실행되기 전에 기본적으로 실행되도록 설정되어 있습니다. 조금 엉성한 것으로 보이지만 대부분의 시나리오에서는 문제가되지 않을 것입니다. – supercat