Visual Basic'te constructor, bir sınıfın örneği oluşturulduğunda çağrılan ve nesneyi başlatan Sub New prosedürüdür. Destructor, kaynakların serbest bırakılması açısından özellikle önemli olan Finalize yöntemi veya IDisposable arayüzü (Dispose yöntemi) ile uygulanır.
Klasik Visual Basic'te, constructor nesneler oluşturulduğunda otomatik olarak çağrılırdı (Class_Initialize) ve destructor nesneler silindiğinde (Class_Terminate) çağrılırdı. VB.NET'te, aşırı yüklenebilir constructorlar, yönetilen ve yönetilmeyen kaynakların serbest bırakılmasını ayırma, çöp toplayıcı (GC) kullanımını içeren yenilikler eklenmiştir.
Constructorların veya destructorların yanlış kullanımı, bellek sızıntılarına, nesnelerin yanlış başlatılmasına veya kaynakların (örneğin dosyaların) kilitlenmesine yol açar.
Nesneleri başlatmak için Sub New kullanın, kaynakları açıkça serbest bırakmak için mutlaka Dispose'i uygulayın. Eğer bir destructor (Finalize) kullanıyorsanız, GC'nin latenliğini ve çağrının zamanını tahmin edemeyeceğinizi unutmayın.
Kod örneği:
Public Class ResourceHolder Implements IDisposable Private resource As SomeResource Public Sub New() resource = New SomeResource() Console.WriteLine("Kaynak tahsis edildi") End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overridable Sub Dispose(disposing As Boolean) If disposing Then If resource IsNot Nothing Then resource.Release() resource = Nothing End If End If End Sub End Class
Anahtar özellikler:
Mevcut bir nesne için Sub New constructorunu manuel olarak çağırmak mümkün mü?
Hayır, constructor sadece nesne oluşturulduğunda çağrılır. Yeniden başlatmak için ayrı bir Reset yöntemi veya benzerini kullanın.
Finalize ne zaman çağrılır ve her zaman garantili midir?
Finalize, nesne yok edilirken çöp toplayıcı tarafından çağrılır, ancak yürütülmesi garanti değildir (örneğin, bir sürecin aniden sonlanması veya güç kesilmesi durumunda).
Dispose içinde GC.SuppressFinalize çağrısının yapılmasının nedeni nedir?
Bu, zaten manuel olarak serbest bırakılmış bir nesne için Finalize çağrısının tekrar yapılmasını önler, performansı artırır ve bellek sızıntılarını önler.
Projede Dispose uygulanmadı ve birkaç dosya uygulama kapandıktan sonra kilitli kaldı - kaynaklar çöp toplayıcının müdahalesine kadar serbest bırakılmadı.
Artılar:
Eksiler:
IDisposable ve Dispose uygulandı, harici kaynaklarla çalışırken Using kullanıldı. Tüm dosyalar düzgün bir şekilde kapatılıyor ve uygulama stabil çalışıyor.
Artılar:
Eksiler: