Udostępnij za pośrednictwem


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

Instancję klasy, obiektu, jest tworzony za pomocą New słowa kluczowego.Zainicjowanie zadania często muszą być wykonywane na nowe obiekty zanim zostaną użyte.Typowe zadania inicjowania obejmują, otwierania plików, połączenia z bazami danych i odczytywania wartości kluczy rejestru.Visual Basic kontroluje Inicjowanie nowych obiektów za pomocą procedury o nazwie konstruktory (specjalne metody, które umożliwiają kontrolę inicjowania).

Obiekt zwolnionego zakres został wydany przez common language runtime (CLR).Visual Basic kontroluje wydaniu zasobów systemowych przy użyciu procedury o nazwie destruktory.Razem konstruktory i destruktory obsługuje tworzenie bibliotek klas niezawodne i przewidywalne.

Za pomocą konstruktory i destruktory

Konstruktory i destruktory sterowanie tworzeniem i niszczeniem obiektów.Sub New i Sub Finalize procedury języka Visual Basic, zainicjować i zniszczyć obiekty; zastępują one Class_Initialize i Class_Terminate metody stosowane w Visual Basic 6.0 i starsze wersje.

hks5e2k6.collapse_all(pl-pl,VS.110).gifNowe Sub

Sub New Konstruktor można uruchomić tylko raz podczas tworzenia klasy.Nie można wywołać w wyraźnie w dowolnym miejscu innym niż w pierwszym wierszu kodu innego konstruktora z tej samej klasy lub klasy pochodnej.Ponadto kod w Sub New metody zawsze uruchamia, zanim inny kod w klasie.Visual Basic 2005i nowszych wersjach niejawnie utworzyć Sub New Konstruktor w czasie wykonywania, jeśli nie zostanie jawnie zdefiniowana Sub New procedury dla klasy.

Aby utworzyć konstruktora dla klasy, należy utworzyć procedurę o nazwie Sub New w dowolnym miejscu definicji klasy.Aby utworzyć Konstruktor sparametryzowana, określ nazwy i dane typy argumentów dla Sub New tylko mogłyby określ argumenty dla innej procedury, jak w poniższym kodzie:

Sub New(ByVal s As String)

Konstruktory są często przeciążone, jak w poniższym kodzie:

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

Podczas definiowania klasy pochodzącej od innej klasy pierwszy wiersz konstruktora musi być wywołanie konstruktora klasy podstawowej, chyba że klasa podstawowa dostępny konstruktor, który nie ma parametrów.Byłoby wywołanie klasy podstawowej, zawierający powyżej konstruktora, na przykład, MyBase.New(s).W przeciwnym razie MyBase.New jest opcjonalny, a Visual Basic środowisko wykonawcze wywołuje ona niejawnie.

Po napisaniu kodu do wywołania konstruktora obiektu nadrzędnego, można dodać dowolny kod inicjowania dodatkowych do Sub New procedury.Sub Newmożna zaakceptować argumenty po wywołaniu jako sparametryzowana konstruktora.Te parametry są przekazywane z procedury, wywołanie konstruktora, na przykład, Dim AnObject As New ThisClass(X).

hks5e2k6.collapse_all(pl-pl,VS.110).gifSub Finalize

Przed zwolnieniem 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 musi wykonać tuż przed obiekt jest niszczony, takie jak kod zamykanie plików i zapisywania informacji o stanie.Istnieje kary nieznaczne wydajność wykonywania Sub Finalize, więc należy zdefiniować Sub Finalize metoda tylko wtedy, gdy trzeba jawnie Zwolnij obiektów.

[!UWAGA]

Garbage collector w CLR nie ma i nie dysponowania niezarządzanego obiektów, obiekty, które system operacyjny wykonuje się bezpośrednio, poza środowiska CLR.Wynika to z różnych obiektów niezarządzanego muszą być unieszkodliwiane w różny sposób.Informacje nie są bezpośrednio związane z obiektem niezarządzana; musi on można znaleźć w dokumentacji dla obiektu.Klasa, która używa obiektów niezarządzanego musi dysponować je w jego Finalize metody.

Finalize Destruktora jest chronione metoda, która może zostać wywołana tylko z tej klasy należy on do lub z klas pochodnych.Wywołania systemowe Finalize automatycznie kiedy niszczony jest obiekt, więc nie należy jawnie wywołać Finalize z poza z klasy pochodne Finalize wdrożenia.

W odróżnieniu od Class_Terminate, który jest wykonywany tak szybko, jak obiekt jest ustawiony na wartość nothing, jest zazwyczaj opóźnienie między kiedy obiekt traci zakresu i ZEW Visual Basic Finalize destruktor.Visual Basic 2005i nowsze wersje umożliwiają drugiego rodzaju destruktor, Dispose, który można jawnie wywołać w dowolnym momencie można natychmiast zwolnić zasoby.

[!UWAGA]

A Finalize destruktora nie powinien zgłosić wyjątków, ponieważ nie obsługiwane przez aplikację i może spowodować zamknięcie aplikacji.

hks5e2k6.collapse_all(pl-pl,VS.110).gifW jaki sposób nowe i finalizowania metod pracy w hierarchii klas

W każdym przypadku, gdy tworzone jest wystąpienie klasy, common language runtime (CLR) próbuje wykonać procedurę o nazwie New, jeśli istnieje on w tym obiekcie.Newjest to rodzaj procedurę o nazwie constructor wykorzystywanej zainicjować nowych obiektów, zanim inny kod w obiekcie jest wykonywany.A New konstruktora może służyć do otwierania plików, połączyć się z bazami danych, inicjowanie zmiennych i opiekę nad innych zadań, które muszą być wykonane przed użyciem obiektu.

Podczas tworzenia instancji klasy pochodne Sub New konstruktora klasy podstawowej wykonuje najpierw następuje konstruktorów klas pochodnych.Wynika to z faktu, że pierwszy wiersz kodu w Sub New Konstruktor używa składni MyBase.New()do wywołania konstruktora klasy bezpośrednio nad sama w hierarchii klas.Sub New Konstruktora jest następnie wywoływana dla każdej klasy w hierarchii klas do konstruktora dla klasy bazowej zostanie osiągnięty.W tym punkcie kodu w konstruktorze klasy podstawowej jest wykonywana, stosowana przez kod wprowadzony w każdym konstruktora dla wszystkich klas pochodnych i ostatnio wykonywany jest kod w najbardziej pochodna klasy.

Konstruktory i dziedziczenie

Gdy obiekt jest już potrzebne, środowisko CLR wywołuje Finalize metody dla tego obiektu przed zwalniania pamięci.Finalize Wywoływana jest metoda destructor , ponieważ wykonuje zadania oczyszczania, takich jak zapisywanie informacji o stanie zamykanie plików i połączeń z bazami danych i inne zadania, które muszą być wykonane przed zwolnieniem obiektu.

Dziedziczenie konstruktorów 2

Interfejs IDisposable

Wystąpienia klasy często kontroli zasobów nie są zarządzane przez środowisko CLR, takich jak Windows uchwyty i połączenia z bazą danych.Zasoby te muszą być unieszkodliwiane w Finalize metody klasy, tak aby zwracane, kiedy niszczony jest obiekt przez garbage collector.Jednakże garbage collector niszczy obiekty tylko wtedy, gdy środowisko CLR wymaga więcej pamięci.Oznacza to, że zasoby nie mogą zostać dopuszczone do długo po obiekt wykracza poza zakres.

Uzupełnienie wyrzucania elementów bezużytecznych, klasach zapewnia mechanizm aktywnie zarządzać zasobami systemu, jeżeli wdrożą one IDisposable interfejsu.IDisposablema jedną metodę, Dispose, którego klienci powinien wywołać, gdy ukończą przy użyciu obiektu.Można użyć Dispose metoda natychmiast zwolnić zasoby i wykonywać zadania, takie jak zamykanie plików i połączenia z bazą danych.W odróżnieniu od Finalize destruktor, Dispose metoda nie jest wywoływana automatycznie.Klienci klasy musi jawnie wywołać Dispose kiedy użytkownik chce natychmiast zwolnić zasoby.

hks5e2k6.collapse_all(pl-pl,VS.110).gifIDisposable wykonawcze

Klasy, która implementuje IDisposable interfejsu powinny obejmować te sekcje kodu:

  • Pole do śledzenia zmian, czy obiekt został usunięty:

    Protected disposed As Boolean = False
    
  • Przeciążenie z Dispose , zwalnia zasoby tej klasy.Metoda ta powinna być wywołana Dispose i Finalize metod klasy podstawowej:

    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
    
  • Przesłonięcie Finalize metodę, która zawiera poniższy kod:

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

hks5e2k6.collapse_all(pl-pl,VS.110).gifWynikające z klasą tego IDisposable implementuje

Klasa, która pochodzi od klasy podstawowej, który implementuje IDisposable interfejs nie jest konieczne przesłonić dowolne metody podstawowej, chyba że korzysta z dodatkowych zasobów, które muszą być usuwane.W takiej sytuacji, w klasie pochodnej powinny zastępować klasy bazowej Dispose(disposing) metody do dysponowania zasobów w klasie pochodnej.Zastąp ten musi wywołać klasy podstawowej 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

Klasa pochodna nie powinny zastępować klasy bazowej Dispose i Finalize metody.Gdy te metody są nazywane z instancją klasy pochodnej, wykonania tych metod klasy podstawowej wywołać zastępująca klasy pochodne Dispose(disposing) metody.

Kolekcja Garbage i finalizowanie destruktor

.NET Framework Korzysta z Odwołanie śledzenia wyrzucania elementów bezużytecznych system okresowo zwolnić nieużywanych zasobów.Program Visual Basic 6.0 i starsze wersje używane innego systemu o nazwie liczenia odniesienia do zarządzania zasobami.Chociaż oba systemy automatycznego wykonywania tej samej funkcji, istnieje kilka istotnych różnic.

Środowisko CLR okresowo niszczy obiekty, gdy system określi, że takie obiekty nie są już potrzebne.Obiekty są zwalniane szybciej, gdy zasoby systemowe są krótkie dostaw i rzadziej inaczej.Opóźnienie między kiedy obiekt traci zakresu i gdy środowisko CLR zwolni oznacza nie, że w przeciwieństwie do obiektów w Visual Basic 6.0 i starsze wersje, można określić dokładnie kiedy obiekt zostaną zniszczone.W takiej sytuacji mówi się obiekty mają - deterministyczny istnienia.W większości przypadków deterministyczny okres istnienia nie zmienia sposobu pisania aplikacji, tak długo, jak należy pamiętać, że Finalize destruktora nie może niezwłocznie wykonać gdy obiekt traci zakresu.

Inna różnica między systemami kolekcji garbage polega na wykorzystaniu Nothing.Do zalet odniesienia zliczania w języku Visual Basic 6.0 i wersjach wcześniejszych, czasami przypisane programistów Nothing do obiektu zmiennych, aby zwolnić odniesienia tych zmiennych.Zmienna posiadanych ostatniego odwołanie do obiektu, obiekt zasobów zostały niezwłocznie zwolnione.W nowszych wersjach programu Visual Basic natomiast mogą wystąpić przypadki, w których ta procedura jest nadal cenne wykonywanie go nigdy nie powoduje odwołanie obiektu natychmiast zwolnić jego zasobów.Aby natychmiast zwolnić zasoby, należy użyć obiektu Dispose metodę, jeżeli są dostępne.Tylko czas należy ustawić zmienną Nothing jest, gdy jego okres istnienia jest długi względem garbage collector czasie do wykrycia osierocone obiekty.

Zobacz też

Informacje

Operator New (Visual Basic)

Dispose

Nic (Visual Basic)

Koncepcje

Inicjowanie i zakończenie składników

Finalizowanie metod i destruktory