Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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; bunlar, Visual Basic 6.0 ve önceki sürümlerde kullanılan Class_Initialize
ve Class_Terminate
yöntemlerinin yerini alır.
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ımlamadığınızda, ç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 MyBase.New
, isteğe bağlıdır ve Visual Basic çalışma zamanı bunu örtük olarak çağırır.
Üst nesnenin oluşturucusunu çağıracak kodu yazdıktan sonra, Sub New
yordamına 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 Finalize
yordam tanımlayan nesneler için Sub Finalize
yöntemini otomatik olarak çağırır. 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 kaybı vardır, bu nedenle yalnızca nesneleri açıkça serbest bırakmanız gerektiğinde bir Sub Finalize
yöntemi tanımlamalısınız.
Uyarı
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ı Finalize
yönteminde yok etmelidir.
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.
Uyarı
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 mevcutsa New
adlı bir yordamı yürütmeye çalışır.
New
, constructor
adlı, bir nesnedeki diğer kodlar yürütülmeden önce yeni nesneleri başlatmak için kullanılan 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ınıfın oluşturucusunu sınıf hiyerarşisinde hemen üstünde çağırmak için MyBase.New()
söz dizimini kullanması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, sınıf metodunda Finalize
atılmalıdır; böylece nesne çöp toplayıcı tarafından yok edildiğinde serbest bırakılacaklar. 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 edici Finalize
yöntemden farklı olarak, Dispose yöntemi 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 kaynaklarını serbest bırakan Dispose aşırı yüklemesi. 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
Dispose yalnızca aşağıdaki kodu içeren bir uygulama.
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 Uygulamasını Yapan Bir Sınıftan Türetme
Arabirimi IDisposable uygulayan bir temel sınıftan türetilen bir sınıf, atılması gereken ek kaynaklar kullanmadığı sürece temel yöntemlerden herhangi birini geçersiz kılmak zorunda değildir. 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öntemlere dair uygulamaları türetilmiş sınıfın Dispose(disposing)
metodunun geçersiz kılınmış halini ç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 Nothing
kullanımını 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 Nothing
atayıp, bu değişkenlerin tuttuğu başvuruları serbest bırakırlardı. 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
olarak ayarlamanız gereken tek durum, çöp toplayıcının başıboş nesneleri algılaması için geçen süreyle karşılaştırıldığında, değişkenin yaşam süresinin uzun olmasıdır.