SORU
29 EYLÜL 2008, PAZARTESİ


Ne zaman GC kullanmalıyım.() SuppressFinalize?

.NET, hangi şartlar altında GC.SuppressFinalize() kullanmalıyım?

Ne avantajı(ler) bu yöntemi kullanarak mı bana?

CEVAP
29 EYLÜL 2008, PAZARTESİ


SuppressFinalize yalnızca bir sonlandırıcı olan bir sınıf tarafından çağrılmalıdır. this nesne tamamen temizlendi Çöp Toplayıcı (GC) bilgilendirilmesi.

Bir sonlandırıcı varsa tavsiye IDisposable desen

public class MyClass : IDisposable
{
    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // called via myClass.Dispose(). 
                // OK to use any private object references
            }

            disposed = true;
        }
    }

    public void Dispose() // Implement IDisposable
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~MyClass() // the finalizer
    {
        Dispose(false);
    }
}

Normalde, CLR oluşturulurken bir sonlandırıcı ile nesneleri (oluşturmak için daha pahalı hale) sekmeleri tutar. SuppressFinalize nesne düzgün temizlendi GC söyler ve sonlandırıcı sırası üzerine gitmesine gerek yok. C bir yıkıcı gibi görünüyor, ama böyle bir şey hareket etmez.

SuppressFinalize optimizasyonu nesneleri uzun zaman sonlandırıcı sırası bekleyen canlı gibi önemsiz değildir. Diğer nesneler üzerinde SuppressFinalize sakıncası aramak için cazip değil. Bu ciddi bir kusur olmasını bekliyor.

Tasarım ilkeleri bir sonlandırıcı eğer nesne IDisposable uygulayan da gerekli değil bizi bilgilendirmek ama eğer bir sonlandırıcı varsa IDisposable sınıf deterministik temizleme izin uygulamak gerekir.

Çoğu zaman uzakta kaynakları temizlemek için IDisposable ile almak gerekir. Sadece nesne yönetilmeyen kaynakları tutar bir sonlandırıcı gerekir ve bu kaynakları temizlediğini garanti gerekir.

Not: Bazen kodlayıcılar kod düzgün IDisposable nesne imha olduğunu test etmek için kendi IDisposable kendi sınıfları oluşturur hata ayıklama için bir sonlandırıcı katacak.

    public void Dispose() // Implement IDisposable
    {
        Dispose(true);
    #if DEBUG
        GC.SuppressFinalize(this);
    #endif
    }

    #if DEBUG
    ~MyClass() // the finalizer
    {
        Dispose(false);
    }
    #endif

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • RealPapaPit

    RealPapaPit

    16 Mart 2009
  • WiseOwlTutorials

    WiseOwlTutor

    21 EKİM 2011