Sdílet prostřednictvím


Životnost objektu: Vytváření objektů a zničeny (Visual Basic)

Vytvoří instanci třídy objektu, New klíčové slovo.Inicializace úlohy často musí provádět na nové objekty před jejich použitím.Běžné úkoly inicializace patří otevírání souborů, připojení k databázím a čtení hodnoty klíče registru.Visual Basic řídí Inicializace nové objekty postupy nazývané konstruktory (zvláštní metody, které umožňují řídit inicializace).

Po objektu opustí oblast působnosti, je vydán společný jazykový modul runtime (CLR).Visual Basic určuje verzi systémové prostředky a postupy nazývané destruktory.Konstruktory a destruktory společně podporují vytváření knihoven tříd robustní a předvídatelné.

Konstruktory a destruktory

Konstruktory a destruktory řízení vytváření a ničení objektů.Sub New a Sub Finalize procedury v jazyce Visual Basic inicializovat a zničit objektů; nahrazují Class_Initialize a Class_Terminate metody používané v Visual Basic verze 6.0 a starší.

hks5e2k6.collapse_all(cs-cz,VS.110).gifNový dílčí

Sub New Konstruktoru lze spustit pouze po vytvoření třídy.Nemůže být volána explicitně kdekoli než v prvním řádku kódu jiného konstruktoru z stejné třídy nebo odvozené třídy.Dále kód v Sub New metoda vždy spustí před jiný kód ve třídě.Visual Basic 2005a novější verze implicitně vytvořit Sub New konstruktor za běhu, pokud nedefinujete explicitně Sub New postup pro třídu.

Chcete-li vytvořit konstruktoru třídy, vytvořte proceduru s názvem Sub New kdekoli v definici třídy.Chcete-li vytvořit parametrizovanou konstruktor zadat názvy a datové typy argumentů Sub New stejně jako by zadat argumenty pro další postup, jako v následujícím kódu:

Sub New(ByVal s As String)

Konstruktory jsou často přetížené, jako v následujícím kódu:

Sub New(ByVal s As String, i As Integer)

Při definování třídy odvozené od třídy jiného prvního řádku konstruktor musí být volání konstruktoru základní třídy, pokud základní třída má přístupné konstruktor, který žádné parametry.Základní třídy, která obsahuje výše konstruktor například volání by MyBase.New(s).Jinak MyBase.New je volitelné a Visual Basic runtime volá je implicitně.

Po napsání kódu pro volání konstruktoru nadřazeného objektu můžete přidat libovolné další inicializaci kódu Sub New postup.Sub Newmůžete přijmout argumenty při volání jako s parametry konstruktoru.Tyto parametry jsou předány z řízení volání konstruktoru, například Dim AnObject As New ThisClass(X).

hks5e2k6.collapse_all(cs-cz,VS.110).gifFinalizovat Sub

Před uvolněním objekty CLR automaticky zavolá Finalize pro objekty, které určují způsob Sub Finalize postup.Finalize Metoda může obsahovat kód, který je potřeba provést těsně před zničení objektu, jako je například kód pro zavírání souborů a ukládání informací o stavu.Je lehké penalizace pro provádění Sub Finalize, takže by měla definovat Sub Finalize metoda pouze v případě, že je třeba výslovně uvolnit objekty.

[!POZNÁMKA]

Nesmyslné kolekcí v CLR není (a nemůže) vyřazení nespravované objekty, objekty, které operační systém provede přímo, mimo prostředí CLR.Je to proto, že různé objekty nespravované musí být zneškodněny různými způsoby.Informace nejsou přímo spojeny s nespravovaným objektu. musí být nalezena v dokumentaci k objektu.Třída, která používá objekty nespravované musí disponovat je v jeho Finalize metoda.

Finalize Destructor je chráněná metoda, kterou lze volat pouze z třídy patří do nebo z odvozených tříd.Volání systému Finalize automaticky při objekt zničen, takže není explicitně volat Finalize z mimo z odvozené třídy Finalize provedení.

Na rozdíl od Class_Terminate, který provede co nejdříve objektu nastavena na nic, je obvykle zpoždění mezi když objekt ztratí oboru a při volání jazyka Visual Basic Finalize destruktoru.Visual Basic 2005a novější verze umožňují druhý druh destructor, Dispose, který lze explicitně volat kdykoli a uvolnit prostředky.

[!POZNÁMKA]

A Finalize destructor není vyvoláním výjimky, protože nelze zpracovat žádosti a může způsobit ukončení aplikace.

hks5e2k6.collapse_all(cs-cz,VS.110).gifJak nové a finalizovat metody práce v hierarchii třídy

Při každém vytvoření instance třídy společného jazykového modulu runtime (CLR) pokusí spustit proceduru s názvem New, pokud existuje v objektu.Newje typ postup se nazývá constructor používané inicializovat nové objekty před provede jiný kód v objektu.A New konstruktor slouží k otevření souborů, připojení k databázím, inicializovat proměnné a starat o další úkoly, které je třeba provést před použitím objektu.

Po vytvoření instance, odvozené třídy Sub New konstruktor základní třídy provede nejprve následuje konstruktory tříd odvozených.Tato situace nastane, protože první řádek kódu v Sub New konstruktor používá syntaxi MyBase.New()volání konstruktoru třídy bezprostředně nad sám v hierarchii třídy.Sub New Konstruktor se pak nazývá každé třídě hierarchie třídy do konstruktoru pro dosažení základní třídy.V tomto okamžiku kód v konstruktoru pro základní třídy provede, následované kódem v každé konstruktoru všechny odvozené třídy a naposledy spuštěn kód ve většině odvozené třídy.

Konstruktory a dědičnost

Když objekt již nepotřebujete, volá CLR Finalize metoda pro tento objekt před uvolněním paměti.Finalize Je volána metoda destructor protože provede vyčištění úkoly, jako je například ukládání informací o stavu zavírání souborů a připojení k databázím a další úkoly, které musí být provedeno před uvolněním objektu.

Inheritance2 konstruktory

Rozhraní IDisposable

Instance třídy často řízení zdrojů, které nejsou spravovány CLR, jako je například systém Windows zpracovává a připojení databáze.Tyto prostředky musí být zneškodněny v Finalize metoda třídy, takže bude se uvolní v případě, že objekt je zničená garbage collector.Garbage collector však ničí objekty pouze v případě CLR vyžaduje více paměti.To znamená, že prostředky se uvolní až po objekt dostane mimo rozsah.

Chcete-li doplnit úklid vaší třídy poskytují mechanismus aktivně spravovat systémové prostředky, pokud implementaci IDisposable rozhraní.IDisposablemá jednu metodu Dispose, klientů, kteří by volání po dokončení pomocí objektu.Můžete použít Dispose metoda okamžitě uvolněte prostředky a provádět úlohy, například zavření souborů a připojení databáze.Na rozdíl od Finalize destructor, Dispose nebyla volána metoda automaticky.Musíte explicitně volat klienty třídy Dispose Pokud chcete uvolnit prostředky.

hks5e2k6.collapse_all(cs-cz,VS.110).gifProvádění IDisposable

Třída, která implementuje IDisposable rozhraní by měla obsahovat tyto části kódu:

  • Pole pro sledování, které zda byl uvolněn objekt:

    Protected disposed As Boolean = False
    
  • Nadměrného počtu Dispose , uvolní prostředky třídy.Tato metoda by měla být volány Dispose a Finalize metody základní třídy:

    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
    
  • Implementace Dispose , který obsahuje následující kód:

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
    
  • Přepsání Finalize metoda, která obsahuje následující kód:

    Protected Overrides Sub Finalize()
        Dispose(False)
        MyBase.Finalize()
    End Sub
    

hks5e2k6.collapse_all(cs-cz,VS.110).gifOdvozené od třídy že implementuje IDisposable

Třídy, který je odvozen ze základní třídy, která implementuje IDisposable rozhraní není třeba přepsat všechny základní metody, pokud používá další prostředky, které musí být zneškodněny.V takové situaci by měl potlačit odvozené třídy základní třídy Dispose(disposing) metoda disponovat prostředky odvozené třídy.Toto přepsání musí volat základní třídy Dispose(disposing) metoda.

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

Základní třídy odvozené třídy není nahradit Dispose a Finalize metod.Pokud tyto metody se nazývají z instance třídy odvozené, volání provádění tyto metody základní třídy odvozené třídy přepsání Dispose(disposing) metoda.

Úklid a finalizovat Destructor

.NET Framework Používá odkaz trasování uvolněné systému pravidelně uvolnění nevyužitých zdrojů.Visual Basic 6.0 a starší verze používá jiný systém nazývaný počítání odkazů ke správě prostředků.Přestože oba systémy automaticky provádět stejnou funkci, existuje několik důležitých rozdílů.

CLR pravidelně ničí objekty, pokud systém zjistí, že takové objekty již nepotřebujete.Objekty jsou vydány rychleji systémové prostředky jsou jinak krátké dodávek a méně často.Zpoždění mezi když objekt ztratí oboru a když CLR uvolní znamená, že na rozdíl od s objekty v jazyce Visual Basic 6.0 a starších verzích nelze určit přesně po objektu budou zničena.V takové situaci jsou označeny objekty mají - deterministický životnost.Ve většině případů-deterministický životnost nezmění jak psát aplikace, pamatujte, že jako Finalize při objekt ztratí oboru není okamžitě provést destruktoru.

Další rozdíl mezi systémy uvolněné zahrnuje použití Nothing.Využít odkaz počítání v jazyce Visual Basic 6.0 a starších verzích, programátory někdy přiřazeno Nothing objektu proměnných uvolnit odkazy na tyto proměnné konat.Pokud proměnná poslední odkaz na objekt, objektu zdroje byly vydány ihned.V novějších verzích jazyka Visual Basic může být případy, ve kterých je tento postup hodnotný, provádění ji nikdy způsobí Odkazovaný objekt ihned uvolnit prostředky.Uvolněte prostředky okamžitě, použijte na objekt Dispose metody, pokud je k dispozici.Pouze byste měli nastavit proměnnou na Nothing je při jeho životnost je dlouhá vzhledem k času trvá kolekcí nesmyslné zjistit osamocené objekty.

Viz také

Referenční dokumentace

Nový operátor (Visual Basic)

Dispose

Nic (Visual Basic)

Koncepty

Inicializace a ukončení součásti

Finalizovat metody a destruktory