문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문
이 설명서는 보관되지만 유지 되지 않습니다.

IDisposable.Dispose 메서드

관리되지 않는 리소스의 확보, 해제 또는 다시 설정과 관련된 응용 프로그램 정의 작업을 수행합니다.

네임스페이스:  System
어셈블리:  mscorlib(mscorlib.dll)

void Dispose()

이 인터페이스를 구현하는 클래스의 인스턴스에서 보유하는 파일, 스트림 및 핸들 등과 같은 관리되지 않는 리소스를 닫거나 해제하려면 이 메서드를 사용합니다. 일반적으로 이 메서드는 개체가 보유하는 리소스를 해제하거나 개체를 다시 사용하기 위해 준비하는 데 관련된 모든 작업에 사용됩니다.

중요중요

C++ 프로그래머는 Destructors and Finalizers in Visual C++를 참조하십시오. .NET Framework 버전 2.0에서 C++ 컴파일러는 리소스의 명확한 삭제 구현은 지원하지만 Dispose 메서드의 직접 구현은 허용하지 않습니다.

이 메서드를 구현하는 경우 포함 계층 구조를 통해 호출을 전파하여 모든 보유 리소스가 확보되는지 확인합니다. 예를 들어, 개체 A가 개체 B를 할당하고 개체 B가 개체 C를 할당하는 경우에는 A의 Dispose 구현이 B에서 Dispose를 호출해야 하며, 그 다음에는 C에서 Dispose를 호출해야 합니다. 또한 기본 클래스가 IDisposable을 구현하는 경우, 개체는 기본 클래스의 Dispose 메서드를 호출해야 합니다.

개체의 Dispose 메서드가 두 번 이상 호출되면, 해당 개체는 첫 번째 호출 이후의 모든 호출을 무시해야 합니다. Dispose 메서드가 여러 번 호출되는 경우 개체는 예외를 throw하지 않아야 합니다. Dispose 이외의 인스턴스 메서드는 리소스가 이미 삭제된 경우 ObjectDisposedException을 throw할 수 있습니다.

리소스 형식은 특정 규칙을 사용하여 할당 상태와 확보 상태를 나타낼 수 있습니다. 예로 열려 있거나 닫혀 있는 것으로 간주되는 스트림 클래스를 들 수 있습니다. 이러한 규칙이 적용된 클래스의 구현자는 Dispose 메서드를 호출하는 공용 메서드를 구현하고 Close와 같은 사용자 지정된 이름을 지정할 수 있습니다.

Dispose 메서드는 명시적으로 호출되어야 하므로 IDisposable을 구현하는 개체도 Dispose가 호출되지 않은 경우에 확보된 리소스를 처리하기 위한 종료자를 구현해야 합니다. 기본적으로 가비지 수집기는 메모리를 회수하기 전에 개체의 종료자를 자동으로 호출합니다. 그러나 Dispose 메서드를 호출하면 일반적으로 가비지 수집기에서 삭제된 개체의 종료자를 호출할 필요가 없습니다. 자동 종료를 방지하기 위해 Dispose 구현 중에 GC.SuppressFinalize 메서드를 호출할 수 있습니다.

Dispose 메서드와 종료자 구현에 대한 자세한 내용은 GC 클래스, Object.Finalize 메서드 및 Finalize 및 Dispose를 구현하여 관리되지 않는 리소스 정리를 참조하십시오.

StreamWriter 와 같이 관리되지 않은 리소스를 액세스하는 개체를 사용하는 경우에는 using 문으로 인스턴스를 만드는 것이 좋습니다. using 문은 스트림을 자동으로 종료하고 이를 사용하는 코드가 완료되면 개체에서 Dispose을 호출합니다. 예제를 보려면 StreamWriter 클래스를 참조하십시오.

다음 예제에서는 Dispose 메서드를 구현하는 방법을 보여 줍니다.


using System;
using System.ComponentModel;

// The following example demonstrates how to create
// a resource class that implements the IDisposable interface
// and the IDisposable.Dispose method.

public class DisposeExample
{
    // A base class that implements IDisposable.
    // By implementing IDisposable, you are announcing that
    // instances of this type allocate scarce resources.
    public class MyResource: IDisposable
    {
        // Pointer to an external unmanaged resource.
        private IntPtr handle;
        // Other managed resource this class uses.
        private Component component = new Component();
        // Track whether Dispose has been called.
        private bool disposed = false;

        // The class constructor.
        public MyResource(IntPtr handle)
        {
            this.handle = handle;
        }

        // Implement IDisposable.
        // Do not make this method virtual.
        // A derived class should not be able to override this method.
        public void Dispose()
        {
            Dispose(true);
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
        }

        // Dispose(bool disposing) executes in two distinct scenarios.
        // If disposing equals true, the method has been called directly
        // or indirectly by a user's code. Managed and unmanaged resources
        // can be disposed.
        // If disposing equals false, the method has been called by the
        // runtime from inside the finalizer and you should not reference
        // other objects. Only unmanaged resources can be disposed.
        protected virtual void Dispose(bool disposing)
        {
            // Check to see if Dispose has already been called.
            if(!this.disposed)
            {
                // If disposing equals true, dispose all managed
                // and unmanaged resources.
                if(disposing)
                {
                    // Dispose managed resources.
                    component.Dispose();
                }

                // Call the appropriate methods to clean up
                // unmanaged resources here.
                // If disposing is false,
                // only the following code is executed.
                CloseHandle(handle);
                handle = IntPtr.Zero;

                // Note disposing has been done.
                disposed = true;

            }
        }

        // Use interop to call the method necessary
        // to clean up the unmanaged resource.
        [System.Runtime.InteropServices.DllImport("Kernel32")]
        private extern static Boolean CloseHandle(IntPtr handle);

        // Use C# destructor syntax for finalization code.
        // This destructor will run only if the Dispose method
        // does not get called.
        // It gives your base class the opportunity to finalize.
        // Do not provide destructors in types derived from this class.
        ~MyResource()
        {
            // Do not re-create Dispose clean-up code here.
            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.
            Dispose(false);
        }
    }
    public static void Main()
    {
        // Insert code here to create
        // and use the MyResource object.
    }
}


.NET Framework

4, 3.5, 3.0, 2.0, 1.1, 1.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

에서 지원

Windows 7, Windows Vista SP1 이상, Windows XP SP3, Windows XP SP2 x64 버전, Windows Server 2008(Server Core는 지원되지 않음), Windows Server 2008 R2(Server Core는 SP1 이상에서 지원됨), Windows Server 2003 SP2

.NET Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.
표시: