Inicjalizacja i kończenie działania składników
Składnik jest inicjowany przez jego konstruktora (SubNew w języku Visual Basic) i zniszczone przez jego destruktor (SubFinalizew języku Visual Basic).Twój części konstruktora jest wywoływane, gdy tworzone jest wystąpienie składnika; nie można następnie wywołać konstruktora.Destruktor nazywa się tuż przed składnik jest zniszczona przez bezużytecznych i odzyskane w jego pamięci.
Uwaga dotycząca języka Visual Basic |
---|
W poprzednich wersjach języka Visual Basic Initialize i Terminate zdarzenia służył na ten sam cel konstruktora i destruktora. |
Oczekiwanie na kolekcji Garbage
Common language runtime wywołuje destruktora na składnik po kolekcji garbage Określa, że składnik nie będzie można osiągnąć przez wykonywanie dowolnego kodu.Dzieje się tak, jeśli wszystkie odwołania do składnika zostały zwolnione lub tylko odwołania do składnika są utrzymywane przez obiekty, które są podobnie odizolowane od wszystkich wykonywanie kodu — na przykład, w przypadku odwołania cykliczne.
Ponieważ może to być opóźnienie między chwilę po zakończeniu użytkownika ze składnika i moment, gdy wywoływana jest jego destruktor, dodatkowego kroku jest wprowadzane do istnienia składników.NET Framework: Jeśli składnik nabywa zasobów systemowych, takich jak połączenia bazy danych lub uchwyty do obiektów systemu Windows, należy zaimplementować IDisposable interfejs i zapewniają Dispose metody użytkownicy składnik mógł zdecydować, kiedy dopuszczenie tych zasobów.
Cykl życia składnika
Wpisz inicjowania: podczas tworzenia pierwszego wystąpienia składnika pierwszy kod wykonywany jest kod inicjowania udostępnionych.Odniesienie do każdego członka udostępnionych spowoduje także udostępnione konstruktora wykonanie.Obejmuje to dowolny udostępnione pola (zmienne), które są inicjowane i udostępnionych konstruktora (SharedSubNew), jeśli istnieje.W poniższym kodzie czcionki odniesienia jest tworzony dla całej klasy.
[!UWAGA]
Kluczowe C#, który odpowiada Shared jest static, który nie powinien być mylony z Static słów kluczowych języka 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.
}
}
[!UWAGA]
Inicjalizacja klasy może wystąpić, nawet jeśli są tworzone żadne wystąpienia składnika.Na przykład abstract (MustInherit) zostaną zainicjowane klasy z funkcji udostępnionych elementów członkowskich i te funkcje będą dostępne dla aplikacji, nawet nie instancji klasy.
Inicjowanie instancji: podczas tworzone jest wystąpienie składnika, są inicjowane danych członków, których kod inicjujący i przeciążenie odpowiedniego konstruktora jest wykonywany.Poniższy kod inicjuje pole private i definiuje dwa konstruktory jeden wywołana, jeśli żadne parametry, a inne, jeśli użytkownik określa 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 } }
Usuwania zasobów: Jeśli zaimplementowano składnik IDisposable interfejsu, należy podać Dispose metody klient powinien zadzwonić po zakończeniu używania składnika.Należy zauważyć, że każdy składnik, który dziedziczy z Component już realizacji domyślne Dispose, która może być zastąpiona zapewnienie dodatkowego kodu.W Dispose metody składnika zwalnia wszystkie zasoby systemu to może być przydzielona, zwalnia odwołania do innych obiektów i renderowany bezużyteczny.Również może być wystąpień, gdzie właściwe jest, aby wywołać własną składnika Dispose metody.Następujący kod usuwa zależnych obiektu, który ma Dispose metody.
' 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 wywołaniu Dispose, klient powinien zwolnić wszystkie pozostałe odwołania do składnika, tak, aby kolekcja garbage można odzyskać pamięci składnika.
Zniszczenie instancji: podczas operacji wyrzucania elementów bezużytecznych wykryje są żadne pozostałe odwołania do składnika, środowisko wykonawcze wywołuje destruktora swoje składnika (Finalizew języku Visual Basic) i zwalnia pamięć.Należy zastąpić klasy bazowej Finalize metodę (Visual Basic) lub zaimplementować destruktor (dla Visual C#) do wykonania kodu oczyszczania, ale zawsze zawiera wywołanie destruktora lub Finalize metoda klasy bazowej.
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 }
Kiedy należy zaimplementować metodę zbycia?
Jeśli składnik dziedziczy z Component, realizacji domyślne Dispose jest dostarczane.Ta implementacja może być zastąpiona zapewniają niestandardowego kodu.Jeśli tworzysz składnik tworząc niestandardową implementację IComponent, należy zaimplementować IDisposable zapewnienie Dispose metody dla składnika.
Składnik musi Dispose metodę, jeśli go przydziela obiekty systemowe, połączenia z bazą danych lub innych ograniczonych zasobów, powinny zostać zwolnione, zaraz po zakończeniu użytkownika ze składnikiem.
Należy implementować Dispose metodę, jeżeli składnik posiada odwołania do innych obiektów, które mają Dispose metody.
Dlaczego wdrożenia zbycia?
W zależności od aktywności systemu nieprzewidywalne interwał może upłynąć pomiędzy czasu użytkownik zakończy się przy użyciu składnika i czas wyrzucania elementów bezużytecznych wykryje, że kod składnika jest nieosiągalny.Jeśli nie podasz Dispose metody składnika będzie nadal do przechowywania swoich zasobów w tym przedziale.
Najgorszy scenariusz
Wyobraźmy sobie składnik serwera, który używa połączenia bazy danych i nie ma Dispose metody.Na serwerze z dużej ilości pamięci może utworzyć i zwolnij wiele wystąpień składnika bez konieczności znacznie wpływ na wolnej pamięci.W przypadku kolekcji garbage nie może zniszczyć składników przez jakiś czas po odwołania do nich są zwolnione.
Ostatecznie wszystkie połączenia dostępne bazy danych może być skrępowany przez składniki, które miały zostały zwolnione, ale nie zostały zniszczone.Mimo że serwera gdyby niedobór pamięci, może być nie może odpowiedzieć na żądania użytkownika.
Zobacz też
Zadania
Porady: tworzenie i konfigurowanie składników w trybie projektowania
Informacje
Koncepcje
Charakterystyka klasy składników
Zmiany tworzenia wystąpienia składnika w języku Visual Basic