IDisposable Arabirim
TOC
İçindekiler tablosunu daralt
İçindekiler tablosunu genişlet
Bu makale, makine tarafından çevrilmiştir. Makaleyi İngilizce dilinde görüntülemek için İngilizce onay kutusunu işaretleyin. Ayrıca, fare işaretçisiyle İngilizce metnin üzerine gelerek metni açılır pencerede de görüntüleyebilirsiniz.
Çeviri
İngilizce

IDisposable Arabirim

 

Yayýmlanma: Ağustos 2016

Yönetilmeyen kaynakları serbest bırakmak için bir mekanizma sağlar.

Bu tür için .NET Framework kaynak koda göz atmak için bkz: Reference Source.

Ad Alanı:   System
Derleme:  mscorlib (mscorlib.dll içinde)

[ComVisibleAttribute(true)]
public interface IDisposable

AdAçıklama
System_CAPS_pubmethodDispose()

Boşaltma, serbest bırakma veya yönetilmeyen kaynakları sıfırlama ile ilişkili uygulama tanımlı görevleri gerçekleştirir.

System_CAPS_noteNot

Bu tür için .NET Framework kaynak kodunu görüntülemek için bkz: Reference Source. Kaynak kodda Çevrimiçi Gözat, çevrimdışı izleme için başvuru indirmek ve hata ayıklama sırasında (düzeltme eklerinin ve güncelleştirmeleri dahil) kaynakları aracılığıyla adım; see instructions.

Birincil bu arabirimin yönetilmeyen kaynakları serbest bırakmak için kullanılır. Çöp toplayıcı otomatik olarak o nesne artık kullanıldığında, yönetilen bir nesnenin ayrılan belleği serbest bırakır. Ancak, çöp toplama ne zaman yapılacağını tahmin etmek mümkün değildir. Ayrıca, atık toplayıcı yönetilmeyen kaynakları pencere işleyicileri gibi hiçbir bilgisi olan veya dosya ve akış açın.

Kullanım Dispose açıkça çöp toplayıcı ile birlikte yönetilmeyen kaynakları serbest bırakmak için bu arabirimin yöntemi. Nesne artık gerekmediğinde tüketici bir nesnenin bu yöntemini çağırabilirsiniz.

System_CAPS_warningUyarı

Eklenecek bölünmesi farklıdır IDisposable Varolan bir sınıf için arabirim. Önceden varolan tüketicileri türünüzün çağıramaz çünkü Dispose, türünüz tarafından tutulan yönetilmeyen kaynakları serbest bırakılır belirli olamaz.

Çünkü IDisposable.Dispose bir örneği tarafından sahip olunan kaynaklar artık gerekmediğinde uygulaması bir tür tüketici tarafından çağrıldığında, yönetilen nesne ya da kaydırılacağını bir SafeHandle (önerilen alternatif) veya geçersiz kılmalısınız Object.Finalize tüketici çağrısı yapmayı unutması durumunda, yönetilmeyen kaynakları serbest bırakmak Dispose.

System_CAPS_importantÖnemli

.NET Framework, C++ derleyicisi kaynakların belirleyici elden destekler ve doğrudan uygulamasına izin vermiyor Dispose yöntemi.

Nasıl hakkında ayrıntılı bilgi için bu arabirimi ve Object.Finalize yöntemi kullanılıyorsa, bkz: Garbage Collection ve Implementing a Dispose Method konuları.

Uygulama IDisposable Yalnızca yönetilmeyen kaynakları doğrudan kullanıyorsanız. Uygulamanızı uygulayan bir nesne yalnızca kullanıyorsa, IDisposable, sağlamıyorsa bir IDisposable uygulaması. Bunun yerine, nesnenin çağırmalıdır IDisposable.Dispose bunu kullanmayı bitirdiğinizde uygulaması. Programlama diliniz bağlı olarak, bunu iki yoldan biriyle yapabilirsiniz:

  • Bir dil kullanarak gibi oluşturmak using C# ve Visual Basic deyimi.

  • Kaydırma çağrısı tarafından IDisposable.Dispose uygulamasında bir try/catch bloğu.

System_CAPS_noteNot

Belgeleri türleri uygulayan IDisposable çağırmak için anımsatıcı içerir ve bu olgu dikkat edin, Dispose uygulaması.

Diliniz bir yapı gibi destekliyorsa kullanarak C# deyimi ve kullanarak deyimi Visual Basic'te kullanabilirsiniz açıkça çağırmak yerine IDisposable.Dispose kendiniz. Aşağıdaki örnek bu yaklaşımı tanımlamakta kullanır bir WordCount sınıfı bir dosya ve sözcük içindeki sayısı hakkında bilgi korur.

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();
      }
      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 Gerçekten sözdizimsel kolaylık ifadesidir. Derleme zamanında dil derleyicisi için Ara dil (IL) uygulayan bir try/catch bloğu.

Hakkında daha fazla bilgi için using deyimi, bkz: Using Deyimi (Visual Basic) veya using Deyimi (C# Başvurusu) Konular.

Programlama diliniz bir yapı gibi desteklemez, using C# veya Visual Basic'te, ifade veya bunu kullanmayı tercih ederseniz, çağırabilirsiniz IDisposable.Dispose uygulamasından finally bloğu bir try/catch deyimi. Aşağıdaki örnek değiştirir using ile önceki örnekte engelle bir try/catch/finally bloğu.

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();
      }
      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; } }
}   

Hakkında daha fazla bilgi için try/finally Desen, bkz: Try...Catch...Finally Deyimi (Visual Basic), try-finally (C# Başvurusu), veya try-finally Deyimi (C).

Uygulamalıdır IDisposable yalnızca türünüz yönetilmeyen kaynakları doğrudan kullanıyorsa. Türünüzün tüketicileri çağırabilir, IDisposable.Dispose örneği artık gerekmediğinde kaynakları serbest bırakmak. İçinde başarısız çağrılacak durumlarında Dispose, türetilmiş bir sınıf ya da kullanım gerektiğini SafeHandle yönetilmeyen kaynakları veya sarmalamak için geçersiz kılın Object.Finalize yöntemi için bir başvuru türü. Kullandığınız her iki durumda da Dispose boşaltma, serbest bırakma veya sıfırlama yönetilmeyen kaynakları gibi yönetilmeyen kaynakları kullandıktan sonra ne olursa olsun temizleme gereklidir yapmak için yöntemi.

System_CAPS_importantÖnemli

Bir temel sınıf tanımlıyorsanız, yönetilmeyen kaynakları kullanan ve, olan ya da, atılmalıdır alt sınıfların olabilir, uygulamalıdır IDisposable.Dispose yöntemi ve ikinci bir aşırı yüklemesini sağlamak Dispose, sonraki bölümde açıklandığı gibi.

Bir temel sınıf atılabilir olmalıdır alt sınıfların ile uygulamalıdır IDisposable gibi. Uygulamanız her Bu desen kullanmalısınız IDisposable olmayan herhangi bir türü üzerinde sealed (NotInheritable Visual Basic'te).

  • Bir ortak, sanal olmayan sağlamalıdır Dispose() yöntemi ve bir korumalı sanal Dispose(Boolean disposing) yöntemi.

  • Dispose() Yöntemini çağırmalıdır Dispose(true) ve sonlandırma için performans göndermeme.

  • Temel türün herhangi sonlandırıcılar içermemelidir.

Aşağıdaki kod parçası, temel sınıf için dispose deseni yansıtır. Türünüz geçersiz olduğunu varsayar Object.Finalize yöntemi.

using Microsoft.Win32.SafeHandles;
using System;
using System.Runtime.InteropServices;

class BaseClass : IDisposable
{
   // Flag: Has Dispose already been called?
   bool disposed = false;
   // Instantiate a SafeHandle instance.
   SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);

   // 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) {
         handle.Dispose();
         // Free any other managed objects here.
         //
      }

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

Geçersiz kılarsanız Object.Finalize yöntemi, sınıfınıza aşağıdaki desenini uygular.

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);
   }
}

Alt sınıfların atılabilir düzeni gibi uygulamanız gerekir:

  • Geçersiz kılmanız gerekir Dispose(Boolean) ve çağrı temel sınıfı Dispose(Boolean) uygulaması.

  • Gerekirse, bir sonlandırıcı sağlayabilir. Sonlandırıcı çağırmalıdır Dispose(false).

Türetilen sınıflar kendilerini uygulamayan olduğunu unutmayın IDisposable arabirim ve parametresiz bir içermez Dispose yöntemi. Bunlar yalnızca temel sınıfı geçersiz Dispose(Boolean) yöntemi.

Aşağıdaki kod parçası, türetilmiş sınıf için dispose deseni yansıtır. Türünüz geçersiz olduğunu varsayar Object.Finalize yöntemi.

using Microsoft.Win32.SafeHandles;
using System;
using System.Runtime.InteropServices;

class DerivedClass : BaseClass
{
   // Flag: Has Dispose already been called?
   bool disposed = false;
   // Instantiate a SafeHandle instance.
   SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);

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

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

      // Free any unmanaged objects here.
      //

      disposed = true;
      // Call base class implementation.
      base.Dispose(disposing);
   }
}

Aşağıdaki örnek uygulayan bir kaynak sınıf nasıl oluşturulacağını gösterir IDisposable arabirimi.

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.
    }
}

Universal Windows Platform
Þu saatten beri kullanýlabilir: 8
.NET Framework
Þu saatten beri kullanýlabilir: 1.1
Portable Class Library
Destekleyen: portable .NET platforms
Silverlight
Þu saatten beri kullanýlabilir: 2.0
Windows Phone Silverlight
Þu saatten beri kullanýlabilir: 7.0
Windows Phone
Þu saatten beri kullanýlabilir: 8.1
Başa dön
Show:
© 2016 Microsoft