è un esempio valido solo per il tuo particolare caso.
Lo scopo del finally non è eseguire codice "dopo" il try catch ma di eseguire codice "sempre" qualsiasi cosa accada dopo il try e dopo i catch anche se per esempio ci sono dei return o dei throw cosa peraltro molto comune.
Il tipo di codice da eseguire in un finally non è quasi mai codice che contiene logica applicativa ma codice di pulizia (dispose ecc.)
considera questo
sia nel try che nel catch la funzione termina passando il controllo al chiamante in modi diversi (return e throw) ma in entrambi i casi il blocco finally viene sempre eseguito.codice:try { p = new Pippo(); p.Risultato = 5 / 0; return p; } catch { throw; } finally { pippo.dispose(); }
Ps.
Non si possono usare return o throw nel finally.