Bellek yönetimi, Visual Basic'de nesnelerle çalışırken kilit bir unsurdur, özellikle de uygulama, manuel serbest bırakma gerektiren kaynaklar kullanıyorsa: dosyalar, veritabanı bağlantıları veya dış nesneler.
Klasik VB'de (VB6) kaynaklar manuel olarak Set obj = Nothing çağrısıyla serbest bırakılırdı. .NET'te (VB.NET) otomatik bir çöp toplayıcı uygulanmıştır, bu da kullanılmayan nesneleri temizler. Ancak, hafızanın serbest bırakılması otomatik olarak yapılmaz, özellikle de unmanaged kaynaklar için.
Otomatik çöp toplayıcı, .NET nesnelerinden hafızayı serbest bırakır, ancak dış veya manuel kaynakların nasıl zamanında alınacağını bilemez (dosya tanımlayıcıları, bağlantılar, akışlar). Bu ayrıntıların göz ardı edilmesi bellek sızıntılarına ve kaynakların kilitlenmesine yol açar.
Dış kaynakların doğru bir şekilde serbest bırakılması için IDisposable arayüzü ve Using...End Using ifadesi kullanılır, bu da deterministic dispose garanti eder.
Kod örneği:
' Dosya tanımlayıcısının garanti edilen serbest bırakılması Using reader As New StreamReader("data.txt") Dim content As String = reader.ReadToEnd() ' ... veri işleme ... End Using ' IDisposable desteklemeyen nesneler için manuel serbest bırakma: Dim obj As SomeComObject = New SomeComObject() ' ... kullanım ... System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) obj = Nothing
Anahtar özellikler:
FileStream için Using kullanılmazsa, kaynak yine de GC sayesinde serbest bırakılır mı?
Hayır, serbest bırakma belirsiz bir anda gerçekleşecektir. Dosya kilitlenmesi ve kaynak sızıntısı ortaya çıkabilir.
Set obj = Nothing çağrısı Dispose() çağrısına eşdeğer midir?
Hayır, Set obj = Nothing yalnızca bir referansı kaldırır, ancak kaynakların hemen serbest bırakılmasını garanti etmez. Dispose() veya Using, deterministic serbest bırakma için tek doğru yoldur.
DataSet/DataTable'dan türeyen nesneler için Dispose çağırmak gerekli midir?
Evet, bunlar GC tarafından serbest bırakılırken, birçok ilişkili kaynak (örneğin, veritabanı bağlantıları) manuel olarak Dispose veya Using çağrısını gerektirir, özellikle DataAdapter, Connection, Command için.
Using veya Dispose olmadan büyük bir dosyadan veri okuma. Bir süre sonra uygulama yeni bir dosya açamaz: "Dosya başka bir işlem tarafından kullanılıyor".
Artıları:
Eksileri:
Using ile bir veritabanı bağlantısı veya dosya açma. Veri alma, işleme, kaynağın otomatik serbest bırakılması.
Artıları:
Eksileri: