Nesne Ömrü: Nesneleri Oluşturma ve Yok Etme (Visual Basic)
Bir sınıfın örneği olan nesne, anahtar sözcüğü kullanılarak New
oluşturulur. Başlatma görevleri genellikle kullanılmadan önce yeni nesneler üzerinde gerçekleştirilmelidir. Yaygın başlatma görevleri arasında dosyaları açma, veritabanlarına bağlanma ve kayıt defteri anahtarlarının değerlerini okuma yer alır. Visual Basic, oluşturucu olarak adlandırılan yordamları (başlatma üzerinde denetime izin veren özel yöntemler) kullanarak yeni nesnelerin başlatılmasını denetler.
Bir nesne kapsam dışına çıktıktan sonra ortak dil çalışma zamanı (CLR) tarafından serbest bırakılır. Visual Basic, yıkıcı olarak adlandırılan yordamları kullanarak sistem kaynaklarının yayınlanmasını denetler. Oluşturucular ve yıkıcılar birlikte sağlam ve öngörülebilir sınıf kitaplıklarının oluşturulmasını destekler.
Oluşturucuları ve Yıkıcıları Kullanma
Oluşturucular ve yıkıcılar nesnelerin oluşturulmasını ve yok edilmesini denetler. Visual Basic'teki Sub New
ve Sub Finalize
yordamları nesneleri başlatır ve yok eder; Visual Basic 6.0 ve önceki sürümlerde kullanılan ve Class_Terminate
yöntemlerinin yerini alırClass_Initialize
.
Alt Yeni
Oluşturucu Sub New
, bir sınıf oluşturulduğunda yalnızca bir kez çalıştırılabilir. Aynı sınıftan veya türetilmiş bir sınıftan başka bir oluşturucunun ilk kod satırından başka bir yerde açıkça çağrılamaz. Ayrıca, yöntemindeki Sub New
kod her zaman bir sınıftaki diğer koddan önce çalışır. Visual Basic, bir sınıf için açık bir Sub New
yordam tanımlamazsanız çalışma zamanında örtük olarak bir Sub New
oluşturucu oluşturur.
Bir sınıf için oluşturucu oluşturmak için, sınıf tanımında herhangi bir yerde adlı Sub New
bir yordam oluşturun. Parametreli bir oluşturucu oluşturmak için, bağımsız değişkenlerin Sub New
adlarını ve veri türlerini, aşağıdaki kodda olduğu gibi diğer yordamların bağımsız değişkenlerini belirttiğiniz gibi belirtin:
Sub New(ByVal s As String)
Oluşturucular, aşağıdaki kodda olduğu gibi sık sık aşırı yüklenir:
Sub New(ByVal s As String, i As Integer)
Başka bir sınıftan türetilen bir sınıf tanımladığınızda, temel sınıfın parametre içermeyen erişilebilir bir oluşturucusunun olmadığı sürece, oluşturucunun ilk satırı temel sınıfın oluşturucusunun çağrısı olmalıdır. Örneğin, yukarıdaki oluşturucuyu içeren temel sınıfa yapılan bir çağrı olabilir MyBase.New(s)
. Aksi takdirde isteğe MyBase.New
bağlıdır ve Visual Basic çalışma zamanı bunu örtük olarak çağırır.
Üst nesnenin oluşturucusunun çağrılabileceği kodu yazdıktan sonra, yordama Sub New
herhangi bir ek başlatma kodu ekleyebilirsiniz. Sub New
parametreli oluşturucu olarak çağrıldığında bağımsız değişkenleri kabul edebilir. Bu parametreler oluşturucuyu çağıran yordamdan geçirilir, örneğin, Dim AnObject As New ThisClass(X)
.
Alt Son Haline Dönüştür
CLR, nesneleri serbest bırakmadan önce bir Sub Finalize
yordam tanımlayan nesneler için yöntemini otomatik olarak çağırırFinalize
. yöntemi, Finalize
dosyaları kapatma ve durum bilgilerini kaydetme kodu gibi bir nesne yok edilmeden hemen önce yürütülmesi gereken kod içerebilir. yürütme Sub Finalize
için küçük bir performans cezası vardır, bu nedenle yalnızca nesneleri açıkça serbest bırakmanız gerektiğinde bir Sub Finalize
yöntem tanımlamanız gerekir.
Not
CLR'deki çöp toplayıcı yönetilmeyen nesneleri, işletim sisteminin doğrudan yürüttüğü nesneleri CLR ortamının dışında atamaz (ve atamaz). Bunun nedeni, farklı yönetilmeyen nesnelerin farklı şekillerde atılması gerekir. Bu bilgiler yönetilmeyen nesneyle doğrudan ilişkili değildir; nesnenin belgelerinde bulunmalıdır. Yönetilmeyen nesneleri kullanan bir sınıf, bunları yönteminde Finalize
atmalıdır.
Finalize
Yıkıcı, yalnızca ait olduğu sınıftan veya türetilmiş sınıflardan çağrılabilen korumalı bir yöntemdir. Bir nesne yok edildiğinde sistem otomatik olarak çağırırFinalize
, bu nedenle türetilmiş bir sınıfın Finalize
uygulamasının dışından açıkça çağırmamalısınızFinalize
.
Aksine Class_Terminate
, bir nesne hiçbir şey olarak ayarlandığı anda yürütülür, genellikle bir nesnenin kapsamını kaybetmesi ile Visual Basic'in yıkıcıyı çağırması Finalize
arasında bir gecikme olur. Visual Basic .NET, IDisposable.Disposekaynakları hemen serbest bırakmak için herhangi bir zamanda açıkça çağrılabilen ikinci bir yıkıcı türü sağlar.
Not
Bir Finalize
yıkıcı, uygulama tarafından işlenmediğinden ve uygulamanın sonlandırılmalarına neden olabileceğinden özel durumlar oluşturmamalıdır.
Sınıf Hiyerarşisinde Yöntemlerin Yeni ve Son Hali Nasıl Çalışır?
Bir sınıfın örneği her oluşturulduğunda, ortak dil çalışma zamanı (CLR) bu nesnede varsa adlı New
bir yordam yürütmeyi dener. New
, bir nesnedeki diğer kodlar yürütülmeden önce yeni nesneleri başlatmak için kullanılan adlı constructor
bir yordam türüdür. Oluşturucu New
dosyaları açmak, veritabanlarına bağlanmak, değişkenleri başlatmak ve bir nesnenin kullanılabilmesi için yapılması gereken diğer görevleri yerine getirmek için kullanılabilir.
Türetilmiş bir sınıfın örneği oluşturulduğunda, Sub New
temel sınıfın oluşturucu ilk olarak yürütülür ve ardından türetilmiş sınıflardaki oluşturucular gelir. Bunun nedeni, bir Sub New
oluşturucudaki ilk kod satırının söz dizimini MyBase.New()
kullanarak sınıfın oluşturucusunun sınıf hiyerarşisinde hemen üstünde çağırmasıdır. Oluşturucu Sub New
daha sonra temel sınıf oluşturucuya ulaşılana kadar sınıf hiyerarşisindeki her sınıf için çağrılır. Bu noktada, temel sınıfın oluşturucusunda kod yürütülür ve ardından tüm türetilmiş sınıflardaki her oluşturucudaki kod ve en son türetilmiş sınıflardaki kod yürütülür.
Bir nesne artık gerekli olmadığında CLR, belleğini boşaltmadan önce bu nesne için yöntemini çağırır Finalize . Yöntem Finalize , durum bilgilerini kaydetme, dosyaları ve veritabanlarına bağlantılar ve nesneyi serbest bırakmadan önce yapılması gereken diğer görevleri kapatma gibi temizleme görevlerini gerçekleştirdiğinden olarak adlandırılır destructor
.
IDisposable Arabirimi
Sınıf örnekleri genellikle Windows tanıtıcıları ve veritabanı bağlantıları gibi CLR tarafından yönetilmeyen kaynakları denetler. Bu kaynaklar, nesne çöp toplayıcı tarafından yok edildiğinde serbest bırakılacak şekilde sınıfının yönteminde atılmalıdır Finalize
. Ancak, atık toplayıcı yalnızca CLR daha fazla boş bellek gerektirdiğinde nesneleri yok eder. Bu, nesne kapsamın dışına çıktıktan çok sonra kaynakların serbest bırakılmayabileceği anlamına gelir.
Atık toplamayı desteklemek için sınıflarınız, arabirimini uygularlarsa IDisposable sistem kaynaklarını etkin bir şekilde yönetmek için bir mekanizma sağlayabilir. IDisposable tek bir yöntemi vardır: Disposebir nesne kullanmayı bitirdiklerinde istemcilerin çağırması gereken yöntem. Kaynakları hemen serbest bırakmak ve dosyaları ve veritabanı bağlantılarını kapatma gibi görevleri gerçekleştirmek için yöntemini kullanabilirsiniz Dispose . Yok ediciden Finalize
farklı olarak yöntemi Dispose otomatik olarak çağrılmaz. Bir sınıfın istemcileri, kaynakları hemen serbest bırakmak istediğinizde açıkça çağırmalıdır Dispose .
IDisposable Uygulama
Arabirimini uygulayan IDisposable bir sınıf şu kod bölümlerini içermelidir:
Nesnenin atılıp atılmadığını izlemeye yönelik bir alan:
Protected disposed As Boolean = False
sınıfının kaynaklarını serbest getiren bir aşırı yükleme Dispose . Bu yöntem, temel sınıfın Dispose ve
Finalize
yöntemleri tarafından çağrılmalıdır:Protected Overridable Sub Dispose(ByVal disposing As Boolean) If Not Me.disposed Then If disposing Then ' Insert code to free managed resources. End If ' Insert code to free unmanaged resources. End If Me.disposed = True End Sub
Yalnızca aşağıdaki kodu içeren bir uygulaması Dispose :
Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub
Yalnızca aşağıdaki kodu içeren yöntemi geçersiz kılma
Finalize
:Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub
IDisposable Uygulayan Bir Sınıftan Türetme
Arabirimini uygulayan bir temel sınıftan türetilen bir sınıfın IDisposable , atılması gereken ek kaynaklar kullanmadığı sürece temel yöntemlerden herhangi birini geçersiz kılması gerekmez. Bu durumda türetilmiş sınıf, türetilmiş sınıfın kaynaklarını atmak için temel sınıfın Dispose(disposing)
yöntemini geçersiz kılmalıdır. Bu geçersiz kılma temel sınıfın Dispose(disposing)
yöntemini çağırmalıdır.
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
' Insert code to free managed resources.
End If
' Insert code to free unmanaged resources.
End If
MyBase.Dispose(disposing)
End Sub
Türetilmiş bir sınıf, temel sınıfın Dispose ve Finalize
yöntemlerini geçersiz kılmamalıdır. Bu yöntemler türetilmiş sınıfın bir örneğinden çağrıldığında, temel sınıfın bu yöntemleri uygulaması türetilmiş sınıfın yöntemini geçersiz kılmasını Dispose(disposing)
çağırır.
Çöp Toplama ve Yok Ediciyi Son Haline Getirme
.NET Framework, kullanılmayan kaynakları düzenli aralıklarla serbest bırakmak için başvuru izleme çöp toplama sistemini kullanır. Visual Basic 6.0 ve önceki sürümleri, kaynakları yönetmek için başvuru sayma adlı farklı bir sistem kullanıyordu. Her iki sistem de aynı işlevi otomatik olarak gerçekleştirse de, birkaç önemli fark vardır.
Sistem bu tür nesnelerin artık gerekli olmadığını belirlediğinde CLR düzenli aralıklarla nesneleri yok eder. Sistem kaynakları yetersiz olduğunda nesneler daha hızlı ve daha az sıklıkta serbest bırakılır. Bir nesnenin kapsamı kaybetmesi ile CLR'nin serbest bırakması arasındaki gecikme, Visual Basic 6.0 ve önceki sürümlerdeki nesnelerin aksine nesnenin tam olarak ne zaman yok olacağını belirleyemeyeceğiniz anlamına gelir. Böyle bir durumda, nesnelerin belirleyici olmayan yaşam süresine sahip olduğu söylenir. Çoğu durumda, bir nesne kapsamı kaybettiğinde yıkıcının Finalize
hemen yürütülemediğini hatırladığınız sürece, belirleyici olmayan yaşam süresi uygulama yazma yönteminizi değiştirmez.
Çöp toplama sistemleri arasındaki bir diğer fark da kullanımını Nothing
içerir. Visual Basic 6.0 ve önceki sürümlerde başvuru sayma avantajından yararlanmak için programcılar bazen nesne değişkenlerine atanarak Nothing
tutulan bu değişkenlerin başvurularını serbest bırakır. Değişken nesneye son başvuruyu tuttuysa, nesnenin kaynakları hemen serbest bırakılır. Visual Basic'in sonraki sürümlerinde bu yordamın hala değerli olduğu durumlar olsa da, bunu gerçekleştirmek başvurulan nesnenin kaynaklarını hemen serbest bırakmasına neden olmaz. Kaynakları hemen serbest bırakmak için, varsa nesnenin Dispose yöntemini kullanın. Bir değişkeni Nothing
ayarlamanız gereken tek zaman, çöp toplayıcının yalnız bırakılmış nesneleri algılamak için geçen süreye göre yaşam süresinin uzun olmasıdır.