2012-09-29 6 views
5

bazowymi w opisie C# 10,13 destruktoryDlaczego destruktory w łańcuchu dziedziczenia tej instancji są wywoływane w kolejności od najbardziej wyprowadzonego do najmniej pochodnego?

„Instancja jest zniszczona, destruktory łańcucha spadku to wystąpienie nazywane są w kolejności od najmniej do najbardziej pochodzi pochodzi”.

Moje pytania są następujące:

dlaczego destruktory nazywane są, w kolejności od najbardziej do najmniej pochodzi pochodzi? dlaczego nie są wywoływane, w kolejności, od najmniej pochodnych do większości pochodnych lub innego porządku?

+1

Wyobraź sobie, że dissasembling dużą strukturę. Zaczynasz od mniejszych części i podchodzisz do góry –

+0

dziękuję Dimitar. Cuong Cześć, dziękuję za poprawę moje pytanie :-) –

Odpowiedz

4

Ponieważ obiekty są budowane od najmniej do najbardziej pochodzi pochodzi, więc muszą być rozebrany z najbardziej pochodzący z lEst pochodzi.

Klasa wyprowadzenie wie o klasie bazowej, ale klasa bazowa nie wiedzieć o klasie pochodnej. Jeśli chcesz zburzyć obiekt z najmniej pochodnej klasy do najbardziej pochodnej klasy, klasa podstawowa usunie rzeczy, które klasa pochodna może potrzebować w procesie.

Rozważmy na przykład, że klasa bazowa posiada listę obiektów:

public class MyBase { 

    public List<SomeObject> list; 

    public MyBase(){ 
    list = new List<SomeObject>(); 
    list.Add(new SomeObject()); 
    list.Add(new SomeObject()); 
    list.Add(new SomeObject()); 
    } 

    ~MyBase() { 
    foreach (SomeObject obj in list) { 
     obj.Cleanup(); 
    } 
    list.Clear(); 
    } 

} 

Klasa pochodna dodaje coś do każdej pozycji na liście:

public class MyDerived : MyBase { 

    public MyDerived() { 
    foreach (SomeObject obj in list) { 
     obj.SomeProperty = new Handler(); 
    } 
    } 

    ~MyDerived(){ 
    foreach (SomeObject obj in list) { 
     obj.SomeProperty.Cleanup(); 
    } 
    } 

} 

Kiedy obiekt zostanie rozebrany, klasa pochodna potrzebuje dostępu do listy, aby wyczyścić to, co zostało dodane. Jeśli klasa bazowa została najpierw zniszczona, klasa pochodna nie będzie miała dostępu do obiektów na liście.

(Należy jednak pamiętać, że IDisposable jest zazwyczaj lepszym rozwiązaniem do obsługi kontrolowane oczyszczanie obiektów.)

+0

dziękuję Guffa.BTW, to mój pierwszy raz tutaj, mogę wiedzieć jak zaznaczyć odpowiedź na poprawną odpowiedź? –

+0

@jacky_shen: Obok każdego pytania znajduje się przycisk z hasłem, którego można użyć do oznaczenia poprawnej odpowiedzi. Zobacz więcej w FAQ: http://stackoverflow.com/faq#howtoask – Guffa

6

Można przypuszczać, że to dlatego, że klasa pochodna posiada wiedzę członków klasy bazowej, a może trzeba je wykorzystywać w destructor. Jeśli podstawowy konstruktor zostanie wywołany jako pierwszy, elementy mogą być niedostępne lub stan obiektu może zostać w nieprawidłowym stanie przez destruktor bazowy.

Klasa bazowa, oczywiście, ma wiedzę lub umiejętności, aby uzyskać dostęp członków jej klas pochodnych, więc problem jest unikać przez pierwsze wywołanie destruktora więcej pochodzący.

Powiązane problemy