Örneğin:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Ne zaman el ile bir yıkıcı oluşturmalıyım? Bir yıkıcı yaratmak için ne zaman ihtiyacın vardı?
Örneğin:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Ne zaman el ile bir yıkıcı oluşturmalıyım? Bir yıkıcı yaratmak için ne zaman ihtiyacın vardı?
Yanıtlar:
GÜNCELLEME: Bu soru Mayıs 2015'teki blogumun konusuydu . Bu mükemmel soru için teşekkürler! İnsanların kesinleştirme konusunda yaygın olarak inandıkları uzun bir yanlışlık listesi için bloga bakın.
Ne zaman el ile bir yıkıcı oluşturmalıyım?
Neredeyse hiç.
Tipik olarak bir kişi sadece sınıfınız nesne kaybolduğunda temizlenmesi gereken bazı pahalı yönetilmeyen kaynaklara tutunursa bir yıkıcı oluşturur. Kaynağın temizlendiğinden emin olmak için tek kullanımlık desen kullanmak daha iyidir. Bir yıkıcı, esasen, nesnenizin tüketicisi onu atmayı unutursa, kaynağın yine de temizlendiğinin bir güvencesidir. (Olabilir.)
Bir yıkıcı yaparsanız son derece dikkatli olun ve çöp toplayıcının nasıl çalıştığını anlayın . Yıkıcılar gerçekten garip :
Bir yıkıcıda normalde doğru olan neredeyse hiçbir şey doğru değildir. Gerçekten, gerçekten dikkatli olun. Doğru bir yıkıcı yazmak çok zordur.
Bir yıkıcı yaratmak için ne zaman ihtiyacın vardı?
Derleyicinin yıkıcıları işleyen kısmını test ederken. Üretim kodunda bunu hiç yapmam gerekmedi. Nadiren yönetilmeyen kaynakları işleyen nesneler yazıyorum.
Buna "sonlandırıcı" denir ve genellikle durumu (yani: alanları) yönetilmeyen kaynakları içeren bir sınıf için yalnızca bir tane oluşturmalısınız (yani: p / invoke çağrıları yoluyla alınan tutamaçlara işaretçiler). Ancak, .NET 2.0 ve sonraki sürümlerde, yönetilmeyen kaynakların temizlenmesi ile ilgilenmenin daha iyi bir yolu vardır: SafeHandle . Bu göz önüne alındığında, bir daha asla finalizer yazmanıza gerek yoktur.
Sınıfınız Windows dosya tanıtıcıları gibi yönetilmeyen kaynakları tutmadıkça bunlara ihtiyacınız yoktur.
Buna yıkıcı / sonlandırıcı denir ve genellikle Atılan kalıbı uygularken oluşturulur.
Sınıfınızın kullanıcısı (sonunda) kaynaklarınızın serbest bırakıldığından emin olmak için Dispose'i aramayı unuttuğunda, ancak yıkıcının ne zaman çağrıldığına dair herhangi bir garantiniz olmadığında geri dönüşlü bir çözümdür.
Bu Yığın Taşması sorusunda , kabul edilen yanıt, imha modelinin nasıl uygulanacağını doğru şekilde gösterir. Bu, yalnızca sınıfınızda çöp toplayıcının kendini temizlemeyi başaramadığı el değmemiş kaynaklar varsa gereklidir.
İyi bir uygulama da, sınıf kullanıcısına kaynakları hemen boşaltmak için nesneyi manuel olarak elden çıkarma imkanı vermeden bir sonlandırıcı uygulamak değildir.
Yönetilmeyen kaynaklarınız olduğunda ve nesneniz kaybolduğunda bunların temizleneceğinden emin olmanız gerektiğinde. İyi örnek COM nesneleri veya Dosya İşleyicileri olabilir.
Bir nesnenin bir WPF uygulaması kapsamında bellekten temizlendiğini görmek için bir yıkıcı (yalnızca hata ayıklama amacıyla) kullandım. Çöp toplamanın nesneyi bellekten gerçekten temizleyip temizlemediğinden emin değildim ve bu doğrulamanın iyi bir yoluydu.
Yıkıcılar, sınıfınızda kapsüllenmiş yönetilmeyen kaynakları boşaltmanın örtük bir yolunu sağlarlar, GC ona ulaştığında çağrılır ve dolaylı olarak temel sınıfın Sonlandırma yöntemini çağırırlar. Yönetilmeyen çok fazla kaynak kullanıyorsanız, IDisposable arabirimi aracılığıyla bu kaynakları boşaltmanın açık bir yolunu sunmak daha iyidir. C # programlama kılavuzuna bakın: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx