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 Finalizeiç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ı Newbir 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.

Screenshot showing class hierarchy constructors and inheritance.

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 .

Screenshot showing the Finalize method 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ı Nothingiç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.

Ayrıca bkz.