SORU
18 Kasım 2008, Salı


Olay işleyicileri oluşan çöp toplama durdurmak mı?

Eğer aşağıdaki kodu var:

MyClass pClass = new MyClass();
pClass.MyEvent  = MyFunction;
pClass = null;

PClass çöp toplanacak? Yoksa hala her ne zaman onlar ortaya olaylarını ateş buralarda olacak? Çöp toplama izin vermek için aşağıdakileri yapmak gerekir?

MyClass pClass = new MyClass();
pClass.MyEvent  = MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;

CEVAP
18 Kasım 2008, Salı


Belirli bir soru için "pClass çöp toplanacak": olay abonelik pClass koleksiyonu (yayıncı olarak) üzerinde hiçbir etkisi yoktur.

Genel olarak GC (özellikle hedef): MyFunction statik veya örnek tabanlı mı olduğuna bağlı.

Bir örnek yöntemi için bir temsilci (olay bir abonelik gibi) örneği için bir başvuru içerir. Yani Evet, olay bir abonelik GC önleyecektir. Ancak, nesne olayı (yukarıda pClass) yayıncılık toplama için uygun olarak, bu bir sorun olmaktan çıkar.

Eğer varsa bu tek yönlü olduğunu unutmayın; örneğin:

publisher.SomeEvent  = target.SomeHandler;

sonra" "" yaşıyor ama "" yayıncı "canlı tutar." hedef hedef tutacak "yayıncı

Bu yüzden hayır: eğer pClass zaten toplanacak ise, dinleyici çıkmak için gerek yoktur. Eğer pClass uzun ömürlü (uzun MyFunction ile örnek daha) olsaydı, ancak daha sonra pClass bu örnek, bu kadar canlı tutabilireğer hedef toplanacak isterseniz çıkmak için gerekli olabilir.

Statik olaylar, ancak, bu nedenle, örnek tabanlı işleyicileri ile birlikte kullanıldığında çok tehlikelidir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Creavite

    Creavite

    8 Mart 2009
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • maxman.tv

    maxman.tv

    29 EKİM 2013