2009-08-17 8 views
22

C# Classes ve deconstructor hakkında biraz kafam karışık.EventHandlers and C# Sınıflar destructor/Dispose

Ben yapıcı içinde alıyorum bir sınıf örneğine birkaç olay işleyicileri tüketmek zorunda: Ben Foo sınıfı tahrip edildiğinde o olaya abonelikten gerekir

public Foo(IFooHandler handler) 
{ 
    handler.Load += Load; 
    handler.Close += Close; 
} 

. IDisposable'u uygulayıp oradan veya bir deconstructor aboneliğinden çıkarıyorum? O olayları tüketmem lazım, başka bir şekilde yapamam.

Sınıflardan biri için bir örnek oluşturur, ilerlemeyi denetler ve sonra sınıf örneği kapsam dışı kalır. Başka bir şey için form kapatılana kadar MainForm'da kalır. İlki endişelendiğim şey, çünkü o olay işleyicisine hala bir referansı olabilir ve düzgün gitmiyor.

Belleği sızdırmak istemiyorum. Ne zaman ve nasıl abonelikten çıkmalıyım?

cevap

24

Olay işleyicileri eklendiğinde çağrılmayacağı için yok edici içinde yapmayın: Bar olayının işleyicisi olarak Foo örnek yöntemini eklediğinizde, Bar, Foo, bu yüzden Foo çöp toplanmayacak ve onun yıkıcısı aramayacak.

Sen IDisposable uygulamak, ve nesneyi imha edilmelidir açıkça

public void Dispose() 
{ 
    if (handler != null) 
    { 
     handler.Load -= Load; 
     handler.Close -= Close; 
    } 
} 
+2

Ah! Yönetilmeyen kodları temizlemedikçe IDC'yi kullanmamalı mıyız diye düşündüm. –

+0

IDisposable diğer nedenlerden dolayı uygulanabilir, yönetilmeyen kaynakların temizlenmesi ile sınırlı değildir ... –

+1

Ortak Tek Kullanımlık Modele bakarsanız, yönetilen ve yönetilmeyen kaynaklar için bir yol vardır. Çoğunlukla yalnızca yönetilmeyen kaynaklarınız ve/veya yönetilenleriniz var. Ama sizin durumunuz için, sadece temizlenmesi gereken kaynakları yönetmeniz yeterlidir. – Oliver

3

Hiç A sınıfı etkinliklere abone uzun ömürlü sınıf ve sınıf (lar) B kısa ömürlü olması olanlar sahip olma sorunuyla karşı karşıya ise A sınıfı o zaman muhtemelen Weak Event Pattern ile ilgilenirsiniz. Bu, keşfettiğiniz bir sorun olabilir, geç olana kadar olan bir sorun olabilir: Princeton self driving car.