Udostępnij za pośrednictwem


Okres istnienia obiektów: w jaki sposób obiekty są tworzone i niszczone (Visual Basic)

Wystąpienie klasy obiektu, jest tworzony przy użyciu New słowo kluczowe.Inicjowanie zadania często muszą być wykonywane na nowe obiekty przed ich użycia.Typowe zadania inicjowania obejmują otwierania plików, połączenia z bazami danych i odczytywania wartości kluczy rejestru.Visual Basic steruje inicjowania nowego obiektu przy użyciu procedury o nazwie konstruktorów (specjalne metody umożliwiające kontrolę nad inicjowania).

Po obiektu pozostawia zakresu, jest zwalniana przez plików wykonywalnych języka (wspólnego CLR).Visual Basic steruje wydania zasobów systemowych przy użyciu procedury o nazwie destruktorów.Razem konstruktory i destruktory obsługuje tworzenie bibliotek klas niezawodną i przewidywalne.

Przy użyciu konstruktory i destruktory

Konstruktory i destruktory kontrolować tworzenie i zniszczeniem obiektów.Sub New i Sub Finalize procedur w języku Visual Basic inicjowania i usunięcie obiektów, zastępują one Class_Initialize i Class_Terminate metody używane w Visual Basic 6.0 i wcześniejszych wersji.

Sub New

Sub New Konstruktor może działać tylko wtedy, gdy po utworzeniu klasy.Nie można jej wywołać bezpośrednio w dowolnym miejscu innym niż w pierwszym wierszu Kodeksu Konstruktor innego z tej samej klasy lub klasy pochodnej.Ponadto w kodzie Sub New Metoda zawsze jest uruchamiana przed uruchomieniem jakiegokolwiek innego kodu w klasie.Visual Basic 2005 i nowszych wersjach niejawnie Utwórz Sub New Konstruktor w czasie wykonywania, jeśli nie zostanie jawnie zdefiniowana Sub New procedury dotyczące klasę.

Aby utworzyć konstruktora klasy, należy utworzyć procedurę o nazwie Sub New dowolnym w definicji klasy.Aby utworzyć sparametryzowana konstruktora, określ nazwy i dane typy argumentów Sub New podobnie jak należy określić argumenty dla innych procedur, tak jak następujący kod:

Sub New(ByVal s As String)

Konstruktory są często przeciążone, tak jak następujący kod:

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

Po zdefiniowaniu klasy pochodzącej od innej klasy pierwszego wiersza konstruktora musi być wywołania konstruktora klasy podstawowej, chyba że klasa podstawowa zawiera dostępny konstruktora, który nie wymaga parametrów.Po wywołaniu klasy podstawowej, zawierający powyżej konstruktora, na przykład będzie MyBase.New(s).W przeciwnym razie MyBase.New jest opcjonalna, a właściwość Visual Basic środowisko wykonawcze wywołuje go niejawnie.

Po napisaniu kodu do wywołania konstruktora obiektu nadrzędnego, możesz dodać dodatkowe inicjowania kodu Sub New procedury.Sub New akceptuje argumenty po wywołaniu jako sparametryzowana konstruktora.Te parametry są przekazywane z procedury, wywołując konstruktora, na przykład Dim AnObject As New ThisClass(X).

Finalizowanie Sub

Przed wydaniem obiektów, automatycznie wywołuje CLR Finalize metody dla obiektów, które definiują Sub Finalize procedury.Finalize Metoda może zawierać kod, który można wykonać tylko przed obiektu, takie jak kod zamykania plików i zapisywania informacji o stanie.Jest zmniejszenie wydajności nieznaczne wykonania Sub Finalize, dlatego należy zdefiniować Sub Finalize metody tylko wtedy, gdy trzeba jawnie zlecenia obiektów.

[!UWAGA]

Moduł zbierający elementy bezużyteczne w środowisku CLR nie ma i nie może usuwa niezarządzanych obiektów, obiektów, do których system operacyjny wykonuje bezpośrednio, poza środowiska CLR.Jest to spowodowane różnych obiektów niezarządzane musi być usuwane na wiele sposobów.Informacje nie są bezpośrednio skojarzone z obiektem niezarządzane; musi on można znaleźć w dokumentacji dla tego obiektu.Klasa, która używa niezarządzanej obiektów musi usuwa je w jego Finalize metody.

Finalize Destruktora jest chroniony metodę, która może zostać wywołana tylko z klasy, należy go do lub klasy pochodnej.Wywołania systemowe Finalize automatycznie po obiekt jest niszczony, więc nie ma jawnie wywoływać metody Finalize z poza klasy pochodnej Finalize implementacji.

W odróżnieniu od Class_Terminate, która wykonuje jako obiekt jest ustawiona na wartość nothing, to zwykle opóźnienie między podczas wywołań Visual Basic i kiedy obiekt traci zakres Finalize destruktora.Visual Basic 2005 i nowsze wersje umożliwiają drugi rodzaj destruktora, Dispose, który może zostać jawnie wywołana w dowolnym momencie, aby natychmiast zwolnić zasoby.

[!UWAGA]

Element Finalize destruktora nie powinien zgłaszają wyjątki, ponieważ nie mogą zostać obsłużone przez aplikację i może spowodować zamknięcie aplikacji.

Jak nowe i Zakończ pracę metod w hierarchii klas

Zawsze, gdy tworzone jest wystąpienie klasy, plików wykonywalnych języka (wspólnego CLR) podejmuje próbę wykonania procedurę o nazwie New, jeśli istnieją w tym obiekcie.New rodzaj procedury o nazwie constructor używany do inicjowania nowego obiektu przed wykonaniem jakiegokolwiek innego kodu obiektu.Element New Konstruktor może służyć do otwierania plików, nawiązać połączenia z bazami danych, zainicjować zmienne i obsługę innych zadań, które muszą być przeprowadzone, zanim będzie można użyć obiektu.

Gdy tworzone jest wystąpienie klasy pochodnej, Sub New konstruktora klasy bazowej wykonuje najpierw następuje konstruktorów w klasach pochodnych.Dzieje się tak ponieważ pierwszego wiersza kodu w Sub New Konstruktor używa składni MyBase.New()wywołać konstruktora klasy bezpośrednio nad się w hierarchii klas.Sub New Konstruktor jest następnie wywoływana dla każdej klasy w hierarchii klas do konstruktora dla klasy podstawowej zostanie osiągnięty.W tym momencie kodu w Konstruktorze dla klasy podstawowej wykonuje, następuje kod w każdej konstruktora w wszystkie klasy pochodnej i ostatniej wykonywany jest kod w klasach najbardziej pochodnych.

Konstruktory i dziedziczenie

W przypadku obiektu nie jest już potrzebna, CLR wywołuje Finalize metody dla tego obiektu przed zwalnianiu pamięci.Finalize Metoda jest wywoływana destructor ponieważ wykonuje zadania oczyszczania, takich jak zapisywania informacji o stanie, zamykanie plików i połączenia z bazami danych i inne zadania, które musi zostać wykonane przed wydaniem obiektu.

Dziedziczenie konstruktorów 2

Interfejs IDisposable

Wystąpień klas często kontrolować zasoby nie są zarządzane przez CLR, takich jak Windows obsługuje i połączenia z bazą danych.Te zasoby musi zostać usunięte w Finalize metody klasy, tak aby one wydane, kiedy przez moduł zbierający elementy bezużyteczne niszczony jest obiekt.Jednak modułowi zbierającemu zniszczy obiekty tylko wtedy, gdy środowisko CLR wymaga większej ilości wolnej pamięci.Oznacza to, że zasoby nie mogą być udostępnione do chwili, gdy obiekt wykracza poza zakres.

Jako uzupełnienie śmieci, klas można podać mechanizm aktywnie zarządzać zasobów systemowych ich zastosowania IDisposable interfejsu.IDisposable zawiera jedną metodę Dispose, którzy klienci należy wywołać, gdy kończyły się przy użyciu obiektu.Można użyć Dispose metody natychmiast zwolnić zasoby i wykonywania zadań, takich jak zamykania plików i połączenia z bazą danych.W odróżnieniu od Finalize destruktora, Dispose Metoda nie jest wywoływana automatycznie.Klienci klasy należy jawnie wywołać Dispose Aby natychmiast zwolnić zasoby.

Wykonania IDisposable

Klasa, która implementuje IDisposable interfejs może zawierać następujące sekcje kodu:

  • Pole rejestrowanie informacji o, czy obiekt został usunięty:

    Protected disposed As Boolean = False
    
  • Przeciążenie Dispose który zwalnia zasoby klasy.Ta metoda powinna zostać wywołana przez Dispose i Finalize metody klasy bazowej:

    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
    
  • Implementacja Dispose zawierający następujący kod:

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
    
  • Zastąpienie z Finalize metodę, która zawiera poniższy kod:

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

Tworzenie elementów pochodnych od klasy implementującej IDisposable

Klasę pochodzącą od klasy podstawowej, który implementuje IDisposable interfejs nie jest konieczne przesłonić metod podstawowych, chyba że używa dodatkowych zasobów, które muszą zostać usunięte.W takim przypadku klasy pochodne powinny przesłaniać klasa podstawowa Dispose(disposing) metody do usuwania zasobów klasy pochodnej.To zastąpienie musi wywołać klasa podstawowa Dispose(disposing) metody.

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

Klasy pochodnej nie powinny przesłaniać klasa podstawowa Dispose i Finalize metody.Gdy te metody są wywoływane z wystąpieniem klasy pochodnej, implementacja klasy podstawowej z tych metod wywołania zastępowania klasy pochodnej Dispose(disposing) metody.

Śmieci i Zakończ destruktora

.NET Framework Używa odwołanie do śledzenia śmieci system, aby okresowo zwolnić nieużywane zasoby.Visual Basic 6.0 i wcześniejszych wersji użyć innego systemu o nazwie zliczaniem odwołań do zarządzania zasobami.Chociaż obu systemów automatycznego wykonania tej samej funkcji, istnieje kilka istotne różnice.

Środowisko CLR okresowo zniszczy obiekty, gdy system Określa, że takie obiekty nie są już potrzebne.Obiekty są zwalniane szybciej, gdy zasoby systemowe są brakować i rzadziej w przeciwnym razie.Opóźnienie między kiedy obiekt traci zakres i kiedy CLR zwolnieniem oznacza, że w odróżnieniu od obiektami w języku Visual Basic 6.0 i wcześniejszych wersji, nie można ustalić dokładnie kiedy obiekt zostaną usunięte.W takiej sytuacji, mówimy o ma obiektów niedeterministyczne okres istnienia.W większości przypadków niedeterministyczne okres istnienia nie zmienia sposobu pisania aplikacji, tak długo, jak należy pamiętać, że Finalize destruktora nie może od razu przeprowadzić, gdy obiekt traci zakresu.

Inna różnica między systemami śmieci wykorzystuje się Nothing.Może korzystać z odwołania zliczania w języku Visual Basic 6.0 i wcześniejszych wersji, czasami przypisane programistów Nothing do obiektu zmienne, aby zwolnić odwołuje się do tych zmiennych zajmowane.Jeśli zmienna posiadanych ostatnich odwołanie do obiektu, zasoby obiektu zostały wydane natychmiast.Nowszych wersjach programu Visual Basic może być przypadki, w których jest bardzo przydatna, tej procedury wykonywania go nigdy nie powoduje, że obiekt występujących w odwołaniu do zwolnienia zasobów natychmiast.Aby zwolnić zasoby od razu, użyj obiektu Dispose metody, jeśli jest dostępny.Tylko wtedy należy ustawić zmienną Nothing jest, gdy jego okres istnienia jest długo względem modułowi zbierającemu czasie do wykrycia obiektów oddzielone.

Zobacz też

Informacje

New — Operator (Visual Basic)

Dispose

Nothing (Visual Basic)

Koncepcje

Inicjalizacja i kończenie działania składników

Inne zasoby

Oczyszczanie zasobów niezarządzanych