내보내기(0) 인쇄
모두 확장
이 문서는 기계로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오. 추가 정보
번역
원본

IDisposable 인터페이스

관리 되지 않는 리소스를 해제 하는 메커니즘을 제공 합니다.

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

[ComVisibleAttribute(true)]
public interface IDisposable

IDisposable 형식에서는 다음과 같은 멤버를 노출합니다.

  이름설명
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Dispose관리되지 않는 리소스의 확보, 해제 또는 다시 설정과 관련된 응용 프로그램 정의 작업을 수행합니다.
위쪽

이 인터페이스의 주된 용도는 관리되지 않는 리소스를 해제하는 것입니다. 가비지 수집기는 관리되는 개체가 더 이상 사용되지 않을 때 해당 개체에 할당된 메모리를 자동으로 해제합니다. 그러나 가비지 수집이 발생하는 시점을 예상할 수는 없습니다. 또한 가비지 수집기는 창 핸들, 열린 파일 및 스트림과 같이 관리되지 않는 리소스를 인식하지 못합니다.

이 인터페이스의 Dispose 메서드를 가비지 수집기와 함께 사용하여 관리되지 않는 리소스를 명시적으로 해제합니다. 개체가 더 이상 필요하지 않을 경우, 개체의 소비자는 이 메서드를 호출할 수 있습니다.

주의 정보주의

추가 하지 않음은 IDisposable 변경 이기 때문에 기존 클래스에 인터페이스.

때문에 IDisposable.Dispose 인스턴스 소유한 리소스를 더 이상 필요 없는 경우 구현 형식의 소비자가 호출 되 면 관리 되는 개체를 배치 하거나 해야는 SafeHandle (권장된 방법) 하거나 재정의 해야 Object.Finalize 소비자 잊어버린 호출 하는 관리 되지 않는 리소스를 해제 하려면 Dispose.

중요중요

C++ 프로그래머는 소멸자 및 종료자에서를 참조하십시오. .NET Framework c + + 컴파일러는 리소스의 명확한 삭제를 지원 하며 직접 구현은 허용 하지 않습니다는 Dispose 메서드가 있습니다.

이 인터페이스와 Object.Finalize 메서드를 사용하는 방법에 대한 자세한 내용은 가비지 수집Dispose 메서드 구현 항목을 참조하십시오.

IDisposable을 구현 하는 개체를 사용 하 여

구현 IDisposable 직접 관리 되지 않는 리소스를 사용 하는 경우에 합니다. 응용 프로그램 구현 하는 개체를 간단 하 게 사용 하는 경우 IDisposable를 제공 하지는 IDisposable 구현. 개체를 호출 해야 하는 대신 IDisposable.Dispose 구현을 사용 했으면 합니다. 프로그래밍 언어에 따라 다음 두 가지 방법 중 하나를 수행할 수 있습니다.

  • 언어를 사용 하 여 생성 등의 using C# 및 Visual Basic 문.

  • 에 대 한 호출을 배치 하 여의 IDisposable.Dispose 구현에는 try/catch 블록.

참고참고

에 대 한 문서 형식을 구현 하는 IDisposable 그 사실을 확인 하 고 호출에 대 한 미리 알림을 포함의 Dispose 구현.

aax125c9.collapse_all(ko-kr,VS.110).gifC# Visual Basic 사용 하 고 문

언어와 같은 구문을 지 원하는 경우는 using C# 및 Visual Basic 문에서 사용할 수 있습니다 명시적으로 호출 하는 대신 IDisposable.Dispose 자신 합니다. 다음 예제에서는이 방법을 정의 WordCount 파일의 단어 개수에 대 한 정보를 유지 하는 클래스입니다.


using System;
using System.IO;
using System.Text.RegularExpressions;

public class WordCount
{
   private String filename = String.Empty;
   private int nWords = 0;
   private String pattern = @"\b\w+\b"; 

   public WordCount(string filename)
   {
      if (! File.Exists(filename))
         throw new FileNotFoundException("The file does not exist.");

      this.filename = filename;
      string txt = String.Empty;
      using (StreamReader sr = new StreamReader(filename)) {
         txt = sr.ReadToEnd();
         sr.Close();
      }
      nWords = Regex.Matches(txt, pattern).Count;
   }

   public string FullName
   { get { return filename; } }

   public string Name
   { get { return Path.GetFileName(filename); } }

   public int Count 
   { get { return nWords; } }
}   


using 문은 실제로 편리한 구문입니다. 중간 언어 (IL)에 대 한 언어 컴파일러에서 컴파일 타임에 구현 된 try/catch 블록.

에 대 한 자세한 내용은 using 문을 참조는 Using 문(Visual Basic) 또는 using 문(C# 참조) 항목입니다.

aax125c9.collapse_all(ko-kr,VS.110).gifTry/Catch 블록

프로그래밍 언어와 같은 구조를 지원 하지 않는 경우는 using C# 또는 Visual Basic 문 사용 하지 않으려는 경우 나는 IDisposable.Dispose 구현에서의 finally 블록는 try/catch 문. 다음 예제는 using 사용 하 여 앞의 예제에서 블록을 try/catch/finally 블록.


using System;
using System.IO;
using System.Text.RegularExpressions;

public class WordCount
{
   private String filename = String.Empty;
   private int nWords = 0;
   private String pattern = @"\b\w+\b"; 

   public WordCount(string filename)
   {
      if (! File.Exists(filename))
         throw new FileNotFoundException("The file does not exist.");

      this.filename = filename;
      string txt = String.Empty;
      StreamReader sr = null;
      try {
         sr = new StreamReader(filename);
         txt = sr.ReadToEnd();
         sr.Close();
      }
      catch {}
      finally {
         if (sr != null) sr.Dispose();     
      }
      nWords = Regex.Matches(txt, pattern).Count;
   }

   public string FullName
   { get { return filename; } }

   public string Name
   { get { return Path.GetFileName(filename); } }

   public int Count 
   { get { return nWords; } }
}   


try /finally 패턴에 대한 자세한 내용은 Try...Catch...Finally 문(Visual Basic), try-finally(C# 참조) 또는 try-finally 문 (C)를 참조하십시오.

IDisposable 구현

구현 해야 IDisposable 형식에서 관리 되지 않는 리소스를 직접 사용 하는 경우에 합니다. 해당 형식의 소비자를 호출할 수 없습니다 사용자 IDisposable.Dispose 인스턴스는 더 이상 필요 없는 리소스를 확보 하려면 구현. 호출에 실패 하는 경우를 처리 하기 Dispose에서 파생 된 클래스를 사용 해야 SafeHandle 재정의 해야 하거나 관리 되지 않는 리소스를 래핑하는 Object.Finalize 메서드는 참조 형식에 대 한. 두 경우 모두 사용 하는 Dispose 메서드를 관리 되지 않는 리소스를 확보, 해제 또는 다시 설정 하는 관리 되지 않는 리소스 등을 사용 하 여 모든 정리는 필요 합니다.

중요중요

기본 클래스를 정의 하는 경우 관리 되지 않는 리소스를 사용 하 고, 또는 삭제 해야 하는 서브 클래스를 가질 수 있는, 구현 해야 하는 IDisposable.Dispose 메서드 두 번째 오버 로드를 제공 하 고 Dispose는 다음 섹션에서 설명 했 듯이.

IDisposable을 상속 계층 구조

삭제 가능해야 하는 서브클래스가 포함된 기본 클래스는 다음과 같이 IDisposable을 구현해야 합니다.

  • 공용 비가상 Dispose() 메서드와 보호된 가상 Dispose(Boolean disposing) 메서드를 제공해야 합니다.

  • Dispose() 메서드를 호출 해야 Dispose(true) 및 성능에 대 한 종료를 억제 해야 합니다.

  • 기본 형식은 종료자를 포함하지 않아야 합니다.

다음 코드는 기본 클래스의 dispose 패턴을 반영합니다. 해당 형식을 재정의 하지 않는 것으로 가정 하면 Object.Finalize 메서드.


using System;

class BaseClass : IDisposable
{
   // Flag: Has Dispose already been called?
   bool disposed = false;

   // Public implementation of Dispose pattern callable by consumers.
   public void Dispose()
   { 
      Dispose(true);
      GC.SuppressFinalize(this);           
   }

   // Protected implementation of Dispose pattern.
   protected virtual void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         // Free any other managed objects here.
         //
      }

      // Free any unmanaged objects here.
      //
      disposed = true;
   }
}


재정의할 때는 Object.Finalize 메서드를 클래스에는 다음과 같은 패턴을 구현 해야 합니다.


using System;

class BaseClass : IDisposable
{
   // Flag: Has Dispose already been called?
   bool disposed = false;

   // Public implementation of Dispose pattern callable by consumers.
   public void Dispose()
   { 
      Dispose(true);
      GC.SuppressFinalize(this);           
   }

   // Protected implementation of Dispose pattern.
   protected virtual void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         // Free any other managed objects here.
         //
      }

      // Free any unmanaged objects here.
      //
      disposed = true;
   }

   ~BaseClass()
   {
      Dispose(false);
   }
}


서브클래스는 다음과 같이 삭제 가능한 패턴을 구현해야 합니다.

  • Dispose(Boolean) 를 재정의하고 기본 클래스 Dispose(Boolean) 구현을 호출해야 합니다.

  • 필요한 경우 종료자를 제공할 수 있습니다. 종료자가 Dispose(false)를 호출해야 합니다.

파생된 클래스 자체를 구현 하지 않는 참고는 IDisposable 인터페이스는 매개 변수가 없는 및 Dispose 메서드. 기본 클래스의 재정의할 Dispose(Boolean) 메서드가 있습니다.

다음 코드는 파생된 클래스에 대해 dispose 패턴을 반영합니다. 해당 형식을 재정의 하지 않는 것으로 가정 하면 Object.Finalize 메서드.


using System;

class DerivedClass : BaseClass
{
   // Flag: Has Dispose already been called?
   bool disposed = false;

   // Protected implementation of Dispose pattern.
   protected override void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         // Free any other managed objects here.
         //
      }

      // Free any unmanaged objects here.
      //
      disposed = true;
   }
}


다음 예제에서는 IDisposable 인터페이스를 구현하는 리소스 클래스를 만드는 방법을 보여 줍니다.


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.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

이식 가능한 클래스 라이브러리

이식 가능한 클래스 라이브러리에서 지원

Windows 스토어 앱용 .NET

Windows 8에서 지원

Windows Phone 앱용 .NET

Windows Phone 8, Silverlight 8.1에서 지원

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(서버 코어 역할은 지원되지 않음), Windows Server 2008 R2(서버 코어 역할은 SP1 이상에서 지원, Itanium은 지원되지 않음)

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

커뮤니티 추가 항목

추가
Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2014 Microsoft