Finally & return

Avete mai provato ad effettuare il return all'interno di un blocco "finally"?
Verrà generato un errore di compilazione:
Diramazioni all'esterno di Finally non valide
Onestamente non ne capisco il perché, però é facilmente possibile aggirare il problema usando il "caro" (si fa per dire) vecchio sistema VB6: la variabile predefinita di ritorno che ha lo stesso nome della funzione/property!


P.S. Anch'io uso IMHO 1.0, grazie Andrea Boschin

powered by IMHO

Print | posted on venerdì 5 novembre 2004 14:01

Comments on this post

# re: Finally & return

Requesting Gravatar...
Io avrei scritto così:

Try
Oggetto = New MiaClasse
Return True
Catch ex As System.Exception
Return False
End Try

...e passa la paura
Left by Fabio Cozzolino on nov 05, 2004 4:58

# re: Finally & return

Requesting Gravatar...
Personalmente non mi piace questa soluzione in quanto il blocco Finally dovrebbe essere utilizzato principalmente per rilascio di risorse; io avrei scritto così:

Overrides Function CreaEInizializzaOggetto as Boolean
dim res as boolean = true
Try
Oggetto = New MiaClasse
Catch ex As System.Exception
Trace.writeline("Errore bla bla...")
res = false
End Try

return res
End Function
Left by Daniele Proietti on nov 05, 2004 5:00

# re: Finally & return

Requesting Gravatar...
Macché paura, é solo che avevo provato e mi ero stupito dell'errore...
X Daniele:
Se puoi evitare di definire una variabile evitalo; allocare e disallocare memoria é un'operazione molto costosa che tutt'ora influisce sulle prestazioni delle applicazioni moderne (guarda questo post di Brad Adams: http://blogs.msdn.com/brada/archive/2003/07/01/50088.aspx).
Come insegna il magnifico del VB (sì, parlo di Francesco Balena) per function e property é meglio ove possibile usare return, ma se serve una variabile che contenga il risultato é fortemente consigliato usare la variabile definita di default da VB (che ha lo stesso nome della function/property). Mi piace pensare che questa variabile sia in realtà mappata direttamente nello spazio di memoria del record dello stack chiamante (non ho mai indagato, ma temo (anzi sono quasi sicuro) una clamorosa smentita) o che lo sarà in future versioni.

Overrides Function CreaEInizializzaOggetto as Boolean
Try
Oggetto = New MiaClasse
CreaEInizializzaOggetto = True
Catch ex As System.Exception
Trace.writeline("Errore bla bla...")
CreaEInizializzaOggetto = False
End Try
End Function

Certo il codice di Fabio é ancora migliore (anche se anche qui bisognerebbe vedere IL alla mano se non viene creata una variabile temporanea di ritorno, prometto che guarderò...)
Left by Michele Bernardi on nov 05, 2004 5:38

# re: Finally & return

Requesting Gravatar...
> Macché paura, é solo che avevo provato e mi ero stupito dell'errore...

Non avevo dubbi, scherzavo...
Left by Fabio Cozzolino on nov 05, 2004 5:57

# re: Finally & return

Requesting Gravatar...
Michele, tutto quello che dici è esatto, ma io quando non ho situazioni critiche per le performance (ad esempio loop nidificati) preferisco avere un solo punto di uscita nelle mie funzioni; anche se questo comporta una variabile in più, che poi essendo un ValueType e venendo memorizzata nello Stack non influenza in nessun modo la mia applicazione.
Non utilizzo la variabile definita di "defalut" in VB per mantenermi in linea con la sintassi C#.
Certo sono tutte considerazioni personali e non necessariamente tutti le debbono prendere in considerazione.
Left by Daniele Proietti on nov 08, 2004 10:20
Comments have been closed on this topic.