UFO ET IT

IDisposable.Dispose ()가 자동으로 호출됩니까?

ufoet 2021. 1. 15. 07:42
반응형

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

반응형