Inicializace a ukončování komponent

Komponenta je inicializována s jeho konstruktoru (SubNew v jazyce Visual Basic) a jeho destruktoru zničeny (SubFinalizev jazyce Visual Basic).Konstruktor dané komponenty je volána, když je vytvořena instance komponenty; poté nelze volat konstruktor.Těsně před komponenty je zničená uvolněné a jeho paměti je uvolněno, nazývá se objekt.

Poznámka k jazyku Visual BasicPoznámka k jazyku Visual Basic

V předchozích verzích jazyka Visual Basic Initialize a Terminate události sloužily ke stejnému účelu jako konstruktor a destruktoru.

Čekání na uvolnění

Společný jazykový modul runtime volání destruktoru dané komponenty po úklid určuje součásti lze již dosaženo podle libovolný kód.K tomu dojde, všechny odkazy na komponenty byly vydány nebo objekty, které jsou podobně izolováno od všech kód drží pouze odkazy na komponenty, například u cyklické odkazy.

Protože lze zpoždění mezi okamžikem po dokončení uživatele s komponenty a okamžikem, kdy se nazývá jeho destruktoru, další krok je zavedena do života rozhraní.NET Framework součásti: Pokud komponenta získá systémové prostředky, například připojení k databázi nebo popisovače objektů systému Windows, měli byste IDisposable rozhraní a poskytnout Dispose metodu tak, aby uživatelé komponenty můžete zvolit při uvolnění těchto prostředků.

Součást životního cyklu

Zadejte inicializace: při první instance komponenty je první kód, který vykonává všechny sdílené inicializační kód.Odkaz na sdílený člen také způsobí sdílené konstruktor spustit.To zahrnuje všechny sdílené polí (proměnné členů), které jsou inicializovány a sdílené konstruktoru (SharedSubNew) Pokud existuje.Následující kód je vytvořen odkaz písma pro celou třídu.

[!POZNÁMKA]

Klíčové C#, která odpovídá Shared je static , který je s nezaměňovat se Static klíčové slovo v jazyce Visual Basic.

Public Class ADrawing
Shared ReadOnly ReferenceFont As New Font("TimesNewRoman", 14)
' Shared constructor does not overload other constructors.
Shared Sub New()
   ' There is no call to the base class's shared constructor.
   ' Insert code to initialize the shared data.
End Sub
End Class
class ADrawing
{
   static Font m_referenceFont = new Font("TimesNewRoman", 14);
   // Simply add the static keyword to create a static constructor.
   // Static constructors do not have any parameters.
   static ADrawing()
   {
      // There is no call to the base class's static constructor.
      // Code to initialize the font here.
   }
}

[!POZNÁMKA]

Inicializace třídy může dojít i v případě, že jsou vytvořeny žádné instance komponenty.Například abstract (MustInherit) třídy pomocí funkce sdíleného členu bude inicializován a tyto funkce budou k dispozici pro použití v aplikaci, i když je vytvořena žádná instance třídy.

  1. Inicializaci instance: při vytvoření instance komponenty, jsou inicializovány datové členy, které mají inicializační kód a je proveden odpovídající konstruktor přetížení.Následující kód inicializuje pole private a definuje dvě konstruktory, jeden volat, pokud neexistují žádné parametry a jiné volán, pokud uživatel určí parametry.

    Class AShape
       Private answer As Integer = 42
       Public Sub New()
          ' Call another constructor with default initialization values.
          MyClass.New(System.Drawing.Color.Red, 5280, DefinedSizes.Large)
       End Sub
       Public Overloads Sub New(myColor As Color, myLength As Integer, _
                Size As DefinedSizes)
          ' Insert code to initialize the class.
       End Sub
       ' Defines the DefinedSizes enum
       Public Enum DefinedSizes
          Large
          Small
       End Enum
    End Class
    
    class AShape
    {
       private int m_answer = 42;
       // Forward to another constructor.
       public AShape() 
       : this(System.Drawing.Color.Red, 5280, DefinedSizes.Large)
       {
          // Additional initialization goes here.
       }
    
       public AShape(Color color, int length, DefinedSizes size)
       {
          // Code to initialize the class goes here.
       }
       // Defines the DefinedSizes enum
       public enum DefinedSizes
       {
          Large,
          Small
       }
    }
    
  2. Vyřazení zdroje: Pokud implementuje komponentu IDisposable rozhraní, musí poskytnout Dispose metodu, která by měl klient volat po dokončení pomocí komponenty.Všimněte si, že jakékoli součásti, která vychází z Component již výchozí provádění Dispose, který může být přepsána poskytnout další vyčištění kódu.V Dispose metoda, komponenty uvolní všechny systémové prostředky, ji může mít přiděleno, uvolní odkazů na jiné objekty a vykresluje nepoužitelný.Mohou také existovat instance, kde je to vhodné pro volání vlastní komponenty Dispose metoda.Následující kód odstraňuje závislé objektu, který má Dispose metoda.

    ' Assumes that the class implements IDisposable
    Public Sub Dispose() Implements IDisposable.Dispose
       myWidget.Dispose
       myWidget = Nothing
       ' Insert additional code.
    End Sub
    
    // Assumes that the class implements IDisposable
    public void IDisposable.Dispose()
    {
       mywidget.Dispose();
       mywidget = null;
       // Dispose of remaining objects.
    }
    
    

    Po volání Dispose, klient by uvolnit všechny zbývající odkazy na komponenty, aby uvolnění paměti můžete uvolnit paměť komponenty.

  3. Instance zničení: uvolněné zjistí, že neexistují žádné zbývající odkazy komponenty, runtime volá danou komponentu destructor (Finalizev jazyce Visual Basic) a uvolní paměť.Základní třída by měl potlačit Finalize metody (Visual Basic) nebo implementovat destruktor (pro Visual C#) implementují vyčištění kódu, ale vždy obsahovat volání se objekt nebo Finalize metody základní třídy.

    Protected Overrides Sub Finalize()
       m_Gadget = Nothing
       m_Gear = Nothing
       MyBase.Finalize()
    End Sub
    
    // In C#, a destructor is used instead of a Finalize method.
    ~ThisClass()
    {
       m_gadget = null;
       m_gear = null;
       // The base class finalizer is called automatically
    }
    

Když je implementovat metody Dispose?

Pokud komponenta dědí z Component, výchozí provádění Dispose je k dispozici.Tato implementace může být přepsána poskytnout vlastní vyčištění kódu.Pokud vytváříte komponentu vytvořením vlastní provádění IComponent, měli byste IDisposable poskytnout Dispose metoda pro komponentu.

Komponenty potřebuje Dispose metodu, pokud se přiděluje systémové objekty, připojení databáze nebo jiných omezených zdrojů, by měly být uvolněny ihned po dokončení uživatele s komponentou.

Měla také implementovat Dispose metodu, pokud komponenta obsahuje odkazy na objekty, které mají Dispose metod.

Proč implementovat nakládat?

Činnost systému nepředvídatelné interval může uplynout mezi dokončením uživatele pomocí komponenty a uvolněné čas zjistí, že Nedosažitelný kód komponenty.Pokud nezadáte Dispose metoda, komponenty budou nadále držet své prostředky během tohoto intervalu.

Případ nejhoršího

Představte si součást serveru, který používá připojení databáze a nemá Dispose metoda.Na serveru velké množství paměti může vytvořit a uvolněte více instancí komponenty bez nutnosti mnohem dopad na volné paměti.V tomto případě uvolněné nemusí zničit součásti určitou dobu po budou uvolněny odkazy na ně.

Nakonec všechna připojení k dispozici databáze může být vázána součástmi, které bylo vydání ale nejsou zničeny.Přestože server měl žádný nedostatek paměti, může být schopen reagovat na požadavky uživatelů.

Viz také

Úkoly

Postupy: Vytváření a konfigurace komponent v režimu návrhu

Referenční dokumentace

Dispose

Finalize

Koncepty

Charakteristika komponentní třídy

Změny vytváření instancí komponent v jazyku Visual Basic