Sdílet prostřednictvím


Doba života objektu: Vytváření a odstraňování objektů (Visual Basic)

Instance třídy objektu, je vytvořen pomocí New klíčové slovo.Inicializace úlohy často musí být provedeny na nové objekty před jejich použití.Běžné úkoly inicializace zahrnují otevírání souborů, připojení k databázím a čtení hodnoty klíčů registru.Visual Basic řídí Inicializace nové objekty pomocí postupů volá konstruktory (speciální metody, které umožňují kontrolu nad inicializace).

Poté, co objekt opustí oboru, je vydána modulem common language runtime (CLR).Visual Basic řídí vydání systémových prostředků pomocí postupů volá destruktory.Dohromady konstruktory a destruktory podporují vytvoření knihovny tříd robustní a předvídatelný.

Pomocí konstruktorů a destruktorů

Konstruktory a destruktory řídit vytváření a zničení objektů.Sub New a Sub Finalize postupy v jazyce Visual Basic inicializovat a zničit objekty, jejich nahradit Class_Initialize a Class_Terminate metody používané v Visual Basic 6.0 a starších verzích.

Nový Sub

Sub New Konstruktor lze spustit pouze jednou, když je vytvořen třídu.Ji nelze volat explicitně kdekoli jiné než na prvním řádku kódu jiného konstruktoru ze stejné třídy nebo z odvozené třídy.Kromě toho kód v Sub New Metoda vždy spustí před spuštěním kódu, v třídě.Visual Basic 2005 a novějších verzích implicitně vytvořit Sub New konstruktor za běhu, pokud jste nedefinují explicitně Sub New postup pro třídu.

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

Sub New(ByVal s As String)

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

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

Když definujete třídu odvozenou z jiné třídy, první řádek konstruktor musí být volání konstruktoru základní třídy, pokud je základní třída obsahuje přístupné konstruktor, který nepřijímá žádné parametry.Volání základní třídu, která obsahuje výše uvedené konstruktoru, například bude MyBase.New(s).V opačném MyBase.New je volitelné a Visual Basic runtime volá jej implicitně.

Když napíšete kód pro volání konstruktoru nadřazeného objektu, můžete přidat jakékoli další inicializační kód k Sub New postupu.Sub New argumenty při volání jako Parametrizovaný konstruktor může přijmout.Tyto parametry jsou předávány v postupu volání konstruktoru, například Dim AnObject As New ThisClass(X).

Sub dokončení

Před uvolnění objektů, CLR automaticky volá Finalize metody pro objekty, které definují Sub Finalize postupu.Finalize Metoda může obsahovat kód, který je třeba provést předtím, než je zničení objektu, jako je například kód pro zavření souborů a ukládání informací o stavu.Je snížení výkonu lehké provedou Sub Finalize, takže je třeba definovat Sub Finalize metodu pouze v případě, že je nutné explicitně uvolnit objekty.

[!POZNÁMKA]

Uvolňování v modulu CLR nespouští (a nelze) zahodí nespravované objekty, objekty, které tento operační systém provede přímo, mimo prostředí CLR.To je způsobeno různé nespravované objekty musí být odstraněny různými způsoby.Tyto informace není přímo přidruženy k nespravované objektu; musí být nalezena v dokumentaci k objektu.Třídu, která používá nespravované objekty musí uvolnění z nich v jeho Finalize metody.

Finalize Je destruktor chráněnou metodu, kterou lze volat pouze z třídy patří do nebo z odvozené třídy.Systémová volání Finalize automaticky při objekt zničení, takže by neměla volat explicitně Finalize z mimo odvozené třídy Finalize implementace.

Na rozdíl od Class_Terminate, který provede jako objekt je nastavena na hodnotu nothing, je obvykle zpoždění mezi když objekt ztratí oboru a když volá jazyka Visual Basic Finalize destruktor.Visual Basic 2005 a novějších verzí umožňující druhý druh destruktor Dispose, které lze kdykoli okamžitě uvolnění prostředků explicitně volat.

[!POZNÁMKA]

Objekt Finalize destruktoru by neměla vyvolat výjimky, protože nelze zpracovat pomocí aplikace a mohou způsobit ukončení aplikace.

Jak nové a dokončení metody práce v hierarchii třídy

Vždy, když je vytvořena instance třídy, modul common language runtime (CLR) pokusí spustit proceduru s názvem New, pokud existuje v tomto objektu.New je typu procedura volána constructor který se používá k inicializaci nové objekty před provedením dalších kódu v objektu.Objekt New konstruktor lze použít k otevření souborů, připojení k databázím, inicializaci proměnné a se stará o všechny úkoly, které je třeba provést před použitím objektu.

Když je vytvořena instance odvozené třídy, Sub New nejprve provede konstruktor základní třídy, za nímž následuje konstruktorů v odvozené třídy.To je způsobeno první řádek kódu v Sub New konstruktor používá syntaxi MyBase.New()volání konstruktoru třídy přímo nad samotného v hierarchii třídy.Sub New Konstruktor je potom volána pro každou třídu v hierarchii třídy až do konstruktoru pro dosažení základní třídy.V tomto okamžiku kódu v konstruktoru pro základní třídu provede, za nímž následuje kód v každém provedení konstruktoru všechny odvozené třídy a poslední spuštění kódu v nejvíce odvozených třídách.

Konstruktory a dědičnosti

Pokud objekt již není potřeba, zavolá CLR Finalize metodu pro tento objekt před uvolněním své paměti.Finalize Metoda je volána destructor vzhledem k tomu, že provede vyčištění úlohy, jako je například ukládání informací o stavu, zavření souborů a připojení k databázím a dalších úloh, které je třeba provést před uvolněním objektu.

Konstruktory Inheritance2

Rozhraní IDisposable

Instance třídy často řízení prostředků není spravovaný pomocí modulu CLR, jako jsou Windows zpracovává a připojení k databázi.Tyto materiály musí být odstraněny v Finalize metody třídy, tak, aby jejich budou vydány, když je objekt zlikvidovány systémem uvolňování.Uvolňování však odstraní objekty pouze v případě, že CLR vyžaduje další volné paměti.To znamená, že prostředky nemusí být vydán až do dlouho poté, co objekt mimo rozsah.

Doplnit uvolňování paměti, může vaše třídy poskytují mechanismus pro aktivně spravovat systémových prostředků v případě, že realizují IDisposable rozhraní.IDisposable má jeden metodu Dispose, kteří klienti by měly volat po dokončení pomocí objektu.Můžete použít Dispose Metoda okamžitě uvolnění prostředků a provádět úlohy, jako je například zavření souborů a připojení databáze.Na rozdíl od Finalize destruktor Dispose Metoda není volána automaticky.Musíte explicitně volat klientů dané třídy Dispose Pokud chcete okamžitě uvolnění prostředků.

Implementace IDisposable

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

  • Pole pro udržování přehledu o, zda byl uvolněn objekt:

    Protected disposed As Boolean = False
    
  • Přetížení Dispose který uvolní prostředky třídy.Tato metoda by měla být volána 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 obsahující pouze následující kód:

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

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

Odvozování od třídy, která implementuje IDisposable

Třída, která je odvozena ze základní třídy, která implementuje IDisposable rozhraní není nutné přepsat základní metod, pokud využívá další prostředky, které musí být zrušen.V této situaci odvozené třídě by měly přepsat základní třídy Dispose(disposing) metodu k uvolnění prostředků odvozené třídy.Toto přepsání musí volat základní třídy Dispose(disposing) metodu.

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

Odvozené třídě by neměl přepsat základní třídy Dispose a Finalize metody.Pokud tyto metody jsou volány z instance odvozené třídy, implementace základní třídy z těchto metod volání přepsání odvozené třídě Dispose(disposing) metody.

Uvolnění paměti a dokončení destruktor

.NET Framework Používá referenční trasování uvolňování systému k uvolnění pravidelně nepoužité zdroje.Visual Basic 6.0 a starších verzích používá jiný systém volá počítání odkazů ke správě prostředků.Přestože obou systémů automaticky provádět má stejnou funkci, existuje několik rozdíly.

Získá typ CLR pravidelně odstraní objekty, když systém zjistí, že tyto objekty již nejsou potřebné.Objekty jsou vydávány rychleji, jsou-li systémových prostředků v krátké napájení a méně často jinak.Prodleva mezi když objekt ztratí oboru a po CLR uvolněním, znamená to, že na rozdíl od s objekty v jazyce Visual Basic 6.0 a starších verzích nelze určit přesně když objekt bude zničení.V takovém případě mít objektů považujeme determinizaci životnost.Ve většině případů determinizaci životnost nemění jak psát aplikace, tak dlouho, dokud si vzpomenout, který Finalize destruktoru nemusí spustit okamžitě, pokud objekt ztratí oboru.

Další rozdíl mezi systémy uvolnění paměti zahrnuje použití Nothing.Využívat referenční počítání v jazyce Visual Basic 6.0 a starších verzích, programátoři někdy přiřazena Nothing k objektu proměnné k uvolnění odkazy na těchto proměnných konat.Ukáže-li proměnnou poslední odkaz na objekt, objektu prostředky vydané okamžitě.V novějších verzích jazyka Visual Basic Ačkoli může existovat případy, ve kterých je stále důležitých tento postup se provádí nikdy způsobí, že odkazovaný objekt, který chcete-li okamžitě uvolnit jeho prostředky.K uvolnění prostředků okamžitě, použijte objektu Dispose metodu, pokud je k dispozici.Pouze byste měli nastavit proměnnou Nothing je v případě jeho životnost je dlouhá relativní na čas uvolňování potřebná ke zjišťování osamocené objekty.

Viz také

Referenční dokumentace

New – operátor (Visual Basic)

Dispose

Nothing (Visual Basic)

Koncepty

Inicializace a ukončování komponent

Další zdroje

Vymazání nespravovaných prostředků