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
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
Akıllı bir işaretçi nedir ve ne zaman ...
Ne zaman ve nasıl ThreadLocal bir deği...
Ne zaman bir form's opaklık ayarı...
Ne zaman C sınıfı bir vs bir yapı kull...
Ne zaman yerine Memcache Memcached kul...