Se viene generata un'eccezione da IEnumerator .MoveNext () o .Current, se debba essere ancora disposti?
-
08-10-2019 - |
Domanda
Intuitivamente penso di sì, ma non sono sicuro se c'è qualche convenzione non so circa.
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.