IDisposable.Dispose ()가 자동으로 호출됩니까?
중복 가능성 :
가비지 수집기가 IDisposable.Dispose를 호출합니까?
관리되지 않는 리소스가있는 클래스가 있습니다. 내 클래스는 IDisposable
인터페이스를 구현 하고 Dispose()
메서드 에서 관리되지 않는 리소스를 해제합니다 . Dispose()
메서드 를 호출해야 합니까? 아니면 어떻게 든 자동으로 호출됩니까? 가비지 콜렉터가 그것을 부를까요?
Dispose()
자동으로 호출되지 않습니다. 있을 경우 종료자를 자동으로 호출됩니다. 구현 IDisposable
은 클래스의 사용자가 가비지 수집기를 기다리는 대신 리소스를 조기에 해제 할 수있는 방법을 제공합니다.
클라이언트가 선호하는 방법 은 예외가 있어도 using
자동 호출을 처리 하는 문 을 사용하는 것입니다 Dispose()
.
적절한 구현 IDisposable
은 다음과 같습니다.
class MyClass : IDisposable
{
private bool disposed = false;
void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// Manual release of managed resources.
}
// Release unmanaged resources.
disposed = true;
}
}
~MyClass() { Dispose(false); }
}
클래스의 사용자가 호출 Dispose()
하면 정리가 직접 수행됩니다. 개체가 가비지 수집기에 의해 잡히면 Dispose(false)
정리를 수행하도록 호출 합니다. 종료 자 ( ~MyClass
메서드) 에서 호출 될 때 관리되는 참조가 유효하지 않을 수 있으므로 관리되지 않는 리소스 만 해제 될 수 있습니다.
using
문 에서 개체를 인스턴스화 하면 코드가 using
블록을 종료 할 때 Dispose ()가 호출됩니다.
using(var myObject = new MyDisposableObject())
{
blah();
} // Dispose() is called here (or whenever the code exits the block)
을 사용하지 않는 경우 using
명시 적으로 Dispose ()를 호출하여 개체를 처리하는 것은 사용자 (호출 코드)의 몫입니다.
또한 사용자 (MyObject 구현 자)는 호출자가 Dispose ()를 호출하지 않는 경우 종료 자에 대한 지원을 추가 할 수 있습니다. 여기에 더 많은 정보가 있습니다 .
리소스가 올바르게 삭제되었는지 확인하려면 소멸자 (finalizer)를 구현 IDisposable
하고 호출 해야합니다 Dispose
.
class Foo : IDisposable
{
private bool m_disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Foo()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (!m_disposed)
{
if (disposing)
{
//release managed resources
}
//release unmanaged resources
m_disposed = true;
}
}
}
당신은 것입니다 아마 같은 구조에서 수동으로이 메소드를 호출해야
using(var myclass = new MyClass())
{
// do something with myclass
}
// now 'myclass'is Disposed
참조 URL : https://stackoverflow.com/questions/6967108/is-idisposable-dispose-called-automatically
'UFO ET IT' 카테고리의 다른 글
SQL Server : 잘못된 버전 661 연결 (0) | 2021.01.15 |
---|---|
단편 애니메이션 및 백 스택 (0) | 2021.01.15 |
C #의 연결 문자열에 지정된 Mongo 데이터베이스를 가져 오는 방법 (0) | 2021.01.15 |
여러 IP 주소에 대해 postgresql postgresql.conf listen_addresses를 구성하는 방법 (0) | 2021.01.15 |
Java 컴파일러가이 변수가 항상 초기화된다는 것을 이해하지 못하는 이유는 무엇입니까? (0) | 2021.01.15 |