표준 Dispose 패턴을 살펴 봤는데 관리 리소스를 무료로 만들기 위해 무엇을 써야하는지 궁금합니다. 이러한 자원이 이미 '관리'되어 있다면 확실하게 아무것도 할 필요가 없습니다.관리 리소스는 언제 관리해야합니까?
그렇다면 내 클래스는 관리되지 않는 리소스를 보유하지 않으므로 (따라서 GC로 마무리 할 필요가 없음) 내 Dispose 메서드에서 마무리를 억제하면됩니까? -
public void Dispose()
{
GC.SuppressFinalize(this);
}
그래서 가정이 내 클래스 :
public sealed class MyClass : IDisposable
{
IList<MyObject> objects; // MyObject doesn't hold any unmanaged resource
private bool _disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!_disposed)
{
// do I need to set the list to null and
// call Dispose on each item in the list?
if (disposing)
{
foreach (var o in objects)
o.Dispose();
objects = null;
}
}
_disposed = true;
}
~MyClass()
{
Dispose(false);
}
}
실제로 여기에 관리되는 리소스를 해제해야합니까? 클래스, 당신은 관리되는 리소스를 사용하고있는 IDisposable
인스턴스를 포함하며, 따라서 당신은 사용자가 리소스를 처리 할 수 있도록 IDisposable
를 구현해야
감사 브라이언, 그것은에 도움이 될 것입니다 IDisposable 인터페이스를 구현하고 GC가 인스턴스를 마무리하지 못하도록 Dispose 구현에서 SuppressFinalize (this)를 호출하면됩니까? – theburningmonk
정리 작업이 없다면 IDisposable을 구현하면 어떤 이점이 있습니까? 나는 IDisposable가 때때로 입력/종료 컨텍스트 구조를 구현하는 데 사용된다는 것을 알고 있지만 IMO는 IDisposable/finalizers의 사용을 둘러싼 명백한 혼란에만 추가됩니다. –
@theburningmonk : GC는 명시 적으로 파이널 라이저를 구현하지 않은 이상 오브젝트를 파이널 라이즈하지 않습니다. 아니요, 그냥'SuppressFinalize'를 호출하기 위해'IDisposable'을 구현할 필요가 없습니다. – LukeH