Aracılığıyla paylaş


Nesne Ömrü: Nesnelerin Oluşturulma ve Yok Edilme Şekli (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; 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.

Sınıf hiyerarşisi oluşturucularını ve devralmayı gösteren ekran görüntüsü.

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 .

Yöntem yıkıcısını sonlandır'ın gösterildiği ekran görüntüsü.

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.

Ayrıca bakınız