Computer >> 컴퓨터 >  >> 프로그램 작성 >> C#

C#에서 Finalize와 Dispose의 차이점은 무엇입니까?

<시간/>

완료

Finalize()는 수집에 적합한 개체가 회수되기 전에 Garbage Collector에 의해 호출됩니다. 가비지 수집기는 참조되지 않은 개체에 대한 메모리 할당을 해제하는 책임을 집니다. Garbage Collector는 메모리에 해당 개체에 대한 유효한 참조가 더 이상 없는 후 어느 시점에서 이 메서드를 호출합니다.

프레임워크는 이러한 일이 발생할 때 가비지 컬렉션을 강제할 수 있다고 보장하지 않지만 프로그램의 성능을 저하시킵니다. Finalize()는 Object 클래스에 속하며 런타임에서 호출됩니다.

예시

using System;
namespace DemoApplication{
   public class Demo{
      ~Demo(){
         Console.WriteLine("Finalize called");
      }
   }
}

폐기

Garbage Collector에서 수집할 수 없는 Windows 핸들, 데이터베이스 연결, 네트워크 연결, 파일 등과 같은 일부 리소스가 있습니다. 특정 개체를 명시적으로 해제하려면 IDisposable을 구현하고 IDisposable 인터페이스의 Dispose() 메서드를 재정의하는 것이 가장 좋습니다.

Dispose() 메서드는 자동으로 호출되지 않으며 객체가 더 이상 필요하지 않을 때 클라이언트 응용 프로그램에서 명시적으로 호출해야 합니다. 개체에 대한 다른 참조가 살아 있는 경우에도 Dispose()를 호출할 수 있습니다.

예시

using System;
namespace DemoApplication{
   public class Demo : IDisposable{
      private bool disposed = false;
      public void Dispose(){
         Dispose(true);
         GC.SuppressFinalize(this);
      }
      protected virtual void Dispose(bool disposing){
         if (!disposed){
            if (disposing){
               //clean up managed objects
            }
            //clean up unmanaged objects
            disposed = true;
         }
      }
   }
}

관리되지 않는 리소스로 작업할 때 Dispose와 Finalize를 모두 구현하는 것이 좋습니다. 개발자가 Dispose 메서드를 명시적으로 호출하는 것을 무시했더라도 개체가 가비지 수집될 때 Finalize 구현이 실행되고 리소스가 계속 해제됩니다.