2010-09-08 17 views

cevap

12

Formda Dispose numaralı telefonu aradığınızda, Controls koleksiyonundaki her denetim için Dispose'u arayacaktır. Bu kontroller de aynısını yapar, bu nedenle sonunda tüm kontroller 'Dispose yönteminin çağrılmış olması gerekir. Bunun kontrollerin tasarımcıda bulunup bulunmadığına bağlı olmadığını unutmayın; Dispose çağrısının yapıldığı anda formun Controls koleksiyonunda bulunan kontrol örneklerini temel alır. Bazı konteyner kendini kontrol ve çağrı birine taban sınıfı veya içerdiği kontroller üzerinde yineleme ve üzerlerinde Dispose çağrı ilerleyen olmadan Dispose geçersiz oluşturursanız

ben bu olmayacaktı görebiliyordu tek durumdur.

+0

Yup. Bileşenler farklı şekilde yapılır, otomatik oluşturulan Dispose() yönteminin işi budur. Bir kontrolün Kontroller koleksiyonundan kaldırılması ve bertaraf edilmemesi, sızıntının iyi bir yoludur. –

4

Olmalıdır. YourForm.designer.cs dosyasına bakmanız gerekebilir. Bu gibi görünecektir:

protected override void Dispose(bool disposing) 
{ 
    if(disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing) 
} 

base.Dispose(); çağrı Formu eklenen kontrolleri temizlik ilgilenir.

+0

Bu doğru değil; Formda, UI olmayan bileşenlere ("Timer", "HelpProvider" veya "BackgroundWorker" gibi) sahip olmadığınız sürece, 'components' alanı 'null'dır. 'bileşenleri' bu bileşenleri bertaraf eder. Düğmeler, metin kutuları vb. Gibi diğer denetimlere * çağrı yapma * çağrısı yapar. –

+0

Tam olarak, formun denetimleri aslında 'base.Dispose()', yani 'Control.Dispose()' çağrısıyla çağrılır. Reflector ile Form.Dispose() 'ya baktığınızda göreceğiniz gibi aslında çok daha fazla temizlik var. –

+0

Güncellemeler, yorumlar için teşekkürler – SwDevMan81

İlgili konular