Aracılığıyla paylaş


CA1063: IDisposable'ı doğru uygulayın

TürAdı

ImplementIDisposableCorrectly

CheckId

CA1063

Kategori

Microsoft.Design

Bozan Değişiklik

Bozmayan

Sebep

IDisposable doğru uygulanmadı.Bu sorunun nedenlerinden bazıları aşağıda listelenmiştir:

  • IDisposal sınıfa yeniden uygulandı.

  • Sonlandırma yeniden geçersizleştirildi.

  • Dispose geçersiz kılındı.

  • Dispose() ortak değil, mühürlenmiş veya Dispose diye adlandırılmıştır.

  • Dispose(bool) korumalı, sanal ya da mühürsüz değildir.

  • Ağzı açık türlerde Dispose(), Dispose(true) olarak çağırmalıdır.

  • Ağzı açık türler için, Finalize uygulaması her ikisini birden veya herhangi bir Dispose(bool) ya da büyük/küçük harf sınıfı sonlandırıcıyı çağırmaz.

Bu kalıpların herhangi birinin ihlali bu uyarıyı tetikleyecek.

Her ağzı açık kök IDisposable türünün kendi korumalı sanal void Dispose(bool) yöntemini sağlaması gerekir.Dispose() Dipose(true)'yu çağırmalıdır ve Finalize Dispose(false)'u çağırmalıdır.Eğer ağzı açık kök IDisposable türü oluşturuyorsanız, Dispose(bool) tanımlamalı ve çağırmalısınız.Daha fazla bilgi için bkz: Yönetilmeyen Kaynakları Temizleme, Design Guidelines for Developing Class LIbraries içindeki .Net Framework belgelendirme bölümü.

Kural Tanımı

Tüm IDisposable türleri Dispose kalıbını doğru gerçekleştirmelidir.

İhlallerin Düzeltilmesi

Kodunuzu inceleyin ve aşağıdaki çözümlerden hangisinin bu ihlali düzelteceğini belirleyin.

  • {0} tarafından uygulanmış arayüz listesinden IDisposal'ı kaldırın ve temel sınıf Dispose uygulaması yerine geçersiz kılın.

  • {0} Türünden sonlandırıcıyı kaldırın, Dispose(bool disposing)'yi geçersiz kılın ve sonlandırma mantığını 'disposing'in' yanlış/false olduğu kod yoluna koyun.

  • {0}'ı Kaldırın, Dispose(bool disposing)'i geçersiz kılın ve dispose mantığını 'disposing'in' doğru/true olduğu kod yoluna koyun.

  • {0}'ın ortak ve mühürlenmiş olarak belirlendiğindeb emin olun.

  • {0}'ı 'Dispose' diye yeniden adlandırın ve onun ortak ve mühürlenmiş olarak belirlendiğinden emin olun.

  • {0}'ın sanal, korumalı ve ağzı açık olarak belirlendiğinden emin olun.

  • {0}'ı düzenleyin böylece Dispose(true) çağırır, sonra geçerli nesne örneğinde GC.SuppressFinalize çağırır ('this' veya 'Me' Visual Basic) içinde ve daha sonra geri döner.

  • {0}'ı düzenleyin böylece Dispose(false) çağırır ve sonra geri döner.

  • Eğer ağzı açık kök IDisposable sınıf yazıyorsanız, IDisposable uygulamasının bu bölümde daha önce anlatılan kalıba uyduğundan emin olun.

Uyarılar Ne Zaman Bastırılmalı

Bu kuraldan bir uyarı gizlemeyin.

Sözde Kod Örneği

Aşağıdaki sözde kod Dispose(bool) uygulanmasının yönetilen ve doğal kaynaklar kullanan bir sınıfta nasıl uygulanması gerektiğine genel bir örnek sağlar.

public class Resource : IDisposable 
{
    private IntPtr nativeResource = Marshal.AllocHGlobal(100);
    private AnotherResource managedResource = new AnotherResource();

// Dispose() calls Dispose(true)
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    // NOTE: Leave out the finalizer altogether if this class doesn't 
    // own unmanaged resources itself, but leave the other methods
    // exactly as they are. 
    ~Resource() 
    {
        // Finalizer calls Dispose(false)
        Dispose(false);
    }
    // The bulk of the clean-up code is implemented in Dispose(bool)
    protected virtual void Dispose(bool disposing)
    {
        if (disposing) 
        {
            // free managed resources
            if (managedResource != null)
            {
                managedResource.Dispose();
                managedResource = null;
            }
        }
        // free native resources if there are any.
        if (nativeResource != IntPtr.Zero) 
        {
            Marshal.FreeHGlobal(nativeResource);
            nativeResource = IntPtr.Zero;
        }
    }
}