Microsoft design guidelines 언급 폐기 패턴과 시나리오 사용 방법 :다른 IDisposable 객체를 참조하는 유형의 기본 패턴을 처리해야합니까?
이 일회용 형식의 인스턴스를 포함하는 유형의 기본 폐기 패턴을 구현 마십시오. 기본 패턴에 대한 세부 사항은 인 기본 배출 패턴 섹션을 참조하십시오. 다음과 같이
나중에, 그들은 기본 폐기 패턴을 보여
- 왜 우리가 그냥 경우 폐기 (BOOL)를 구현해야합니까 : 있습니다
public class DisposableResourceHolder : IDisposable { private SafeHandle resource; // handle to a resource public DisposableResourceHolder(){ this.resource = ... // allocates the resource } public void Dispose(){ Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing){ if (disposing){ if (resource!= null) resource.Dispose(); } } }
내 질문 매개 변수가 true 인 단일 호출? 매개 변수가없는
Dispose() {resource?.Dispose();}
으로 쉽게 간단하게 만들 수 있습니다. 참조하는 객체가 관리되고 자체 finalizer가 있으므로 여기에 finalizer가 필요하지 않으므로 누출되지 않습니다. - finalizer가 없는데
GC.SuppressFinalize(this)
으로 전화하는 것이 좋습니다. GC는 존재하지 않기 때문에 어쨌든 파이널 라이저를 호출하지 않을 것입니다! - Dispose (bool)의 필요성을 알 수있는 유일한 경우는 IDisposable이나 finalizer (this article에 표시된 것과 같이)를 구현하지 않는 관리되지 않는 참조가 실제로있는 경우입니다. 그러나
bool disposing
의 의미는bool includingManagedResources
입니다. 그렇다면 왜 그것이 실제로 그렇게해야하는지에 대해 오도 된 '처분'을하는 이유는 무엇입니까?
그렇지 않습니다. Microsoft는 finalizers가있는 클래스를 작성 했으므로 이러한 문제에 대해 걱정했습니다. 나만의 파이널 라이저 작성하지 마십시오. Microsoft가 SafeHandle 클래스를 만들 때까지 기다렸습니다. –
이 패턴의 추론은 클래스에서 상속받을 수 있으며 상속 된 클래스는 finalizer를 가질 수 있습니다. 그리고 아니오 - 당신은 이것을 할 필요가 없습니다. – Evk
@Evk는 실제로 의미가 있습니다 ... 감사합니다! –