He estado ayudando a un colega a depurar algún comportamiento extraño en su código. El siguiente ejemplo ilustra esto:¿Por qué mi bloque finalmente no funciona en C#?
static void Main(string[] args)
{
string answer = Sample();
Console.WriteLine(answer);
}
public static string Sample()
{
string returnValue = "abc";
try
{
return returnValue;
}
catch (Exception)
{
throw;
}
finally
{
returnValue = "def";
}
}
¿Qué devuelve este ejemplo?
¿Crees que debido al bloque finally, devuelve "def" pero de hecho, devuelve "abc"? He revisado el código y he confirmado que el bloque finalmente se invoca.
La verdadera respuesta es que no deberías escribir código como este en primer lugar, pero todavía estoy desconcertado en cuanto al comportamiento.
Editar: Para aclarar el flujo en función de algunas de las respuestas.
Al recorrer el código, finalmente se ejecuta antes de la devolución.
Duplicado de:What really happens in a try { return x; } finally { x = null; } statement?
esto está mal..Si la declaración de devolución está dentro de un bloque try, el bloque finally, si existe, se ejecutará antes de que el control regrese al método de llamada. – TStamper
TStamper: el valor de retorno se evalúa en la prueba mientras la variable sigue siendo "abc", luego finalmente se ejecuta y cambia la asignación de la variable pero NO se devuelve lo que ya se ha almacenado en caché. – Chuck
cierto, pero la redacción es incorrecta. De lo que él está diciendo, el código no continúa ejecutándose en la función de Muestra – TStamper