Se viene generata un'eccezione da IEnumerator .MoveNext () o .Current, se debba essere ancora disposti?

StackOverflow https://stackoverflow.com/questions/4416100

Domanda

Intuitivamente penso di sì, ma non sono sicuro se c'è qualche convenzione non so circa.

È stato utile?

Soluzione

Dal momento che non possiamo sapere ciò che l'implementazione è, la risposta è solo sicuro è "sì".

Tuttavia, è molto raro da usare IEnumerator direttamente - foreach essere più comune. Per il IEnumerator<T> generica è possibile utilizzare una dichiarazione utilizzando:

using(var iter = obj.GetEnumerator()) {
    ...
}

Anche senza la versione generica, si può barare:

IEnumerator iter = obj.GetEnumerator();
using(iter as IDisposable) {
    ...
}

che disporrà iter se è IDisposable

Altri suggerimenti

n oggetto monouso deve essere smaltito, mai. [1]

Ma dovrebbe essere. Come blocco using utilizzata la clausola finally smaltire e questo viene eseguito se il blocco using si esce normalmente o tramite un'eccezione, il default è di disporre anche di fronte di un'eccezione.


[1] Suppongo che uno potrebbe avere un'implementazione buggy in cui una risorsa non gestita si tiene e non c'è finaliser, ma l'azione corretta non è quello di attuare un finaliser.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top