2012-09-29 9 views
5

base delle specifiche C#, 10.13 distruttoriPerché i distruttori della catena ereditaria di quell'istanza vengono chiamati, in ordine, dalla maggior parte derivata a quella meno derivata?

"Quando un'istanza è destructed, i distruttori in catena di ereditarietà di tale istanza sono chiamati, in ordine, dal più al meno derivato derivato."

Le mie domande sono:

perché distruttori sono chiamati, in ordine, dal più al meno derivato derivato? perché non vengono chiamati, nell'ordine, dal meno derivato alla maggior parte dei derivati ​​o altro ordine?

+1

Immagina di essere dissasembling una grande struttura. Si inizia dalle parti più piccole e si va su –

+0

grazie Dimitar. Ciao Cuong, grazie per aver migliorato la mia domanda :-) –

risposta

4

Poiché gli oggetti vengono creati dal meno derivato al più derivato, quindi devono essere eliminati dal più derivato al meno derivato.

La classe derivante conosce la classe base, ma la classe base non conosce la classe derivata. Se si eliminasse l'oggetto dalla classe meno derivata alla classe più derivata, la classe base rimuoverà le cose che la classe derivata potrebbe aver bisogno nel processo.

Si consideri per esempio che la classe base ha un elenco di oggetti:

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(); 
    } 

} 

La classe derivata aggiunge qualcosa ad ogni elemento della lista:

public class MyDerived : MyBase { 

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

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

} 

Quando l'oggetto viene abbattuto, la classe derivata ha bisogno di accedere all'elenco per ripulire ciò che ha aggiunto. Se la classe base è stata prima distrutta, la classe derivata non avrebbe accesso agli oggetti nell'elenco.

(Si noti, tuttavia, che IDisposable normalmente è una scelta migliore per gestire la pulitura controllata di oggetti.)

+0

grazie Guffa.BTW, è la mia prima volta qui, posso sapere come contrassegnare la risposta alla risposta corretta? –

+0

@jacky_shen: C'è un pulsante con un segno di spunta accanto a ciascuna domanda, che è possibile utilizzare per contrassegnare una risposta corretta. Vedi di più nelle domande frequenti: http://stackoverflow.com/faq#howtoask – Guffa

6

Presumibilmente, è perché la classe derivata ha conoscenza dei membri della classe base e potrebbe aver bisogno di usarli nel distruttore. Se il costruttore di base viene chiamato per primo, i membri potrebbero non essere disponibili, oppure lo stato dell'oggetto potrebbe essere stato messo in uno stato non valido dal distruttore di base.

La classe base, ovviamente, non ha conoscenza o capacità di accedere ai membri delle sue classi derivate, quindi il problema viene evitato chiamando prima il distruttore più derivato.

Problemi correlati