Pregunta

Considera,

        static void Main(string[] args)
        {
            Console.WriteLine(fun());
        }

        static int fun()
        {
            int i = 0;
            try
            {
                i = 1;
                return i;
            }
            catch (Exception ex)
            {
                i = 2;
                return i;
            }
            finally
            {
                i = 3;
            }
        }

El código de muestra genera " 1 " ;. pero el valor de i se cambia a 3 en el bloque finalmente. ¿Por qué no se cambió el valor de 'i' a 3?

Gracias,

¿Fue útil?

Solución

Considere este código: creo que el código explica lo que está pensando y cómo puede hacer que lo que cree que suceda realmente suceda:

static void Main(string[] args)
{
    int counter = 0;
    Console.WriteLine(fun(ref counter)); // Prints 1
    Console.WriteLine(counter); // Prints 3
}        

static int fun(ref int counter)
{
  try
  {
      counter = 1;
      return counter;
  }
  finally
  {
      counter = 3;
  }
}

Con este código, devuelve 1 del método, pero también establece la variable de contador en 3, a la que puede acceder desde fuera del método.

Otros consejos

Debe recordar que finalmente se ejecuta después de todo lo demás en el intento y captura. Coloque la declaración de devolución después de la declaración try / catch / finally para que devuelva 3.

Me imagino que si usa un tipo de referencia en lugar de un tipo de valor, obtendría un comportamiento diferente.

Cuando dijiste `` return i '' ... C # pone ese valor de retorno en un área de retención temporal (memoria) y luego ejecuta tu código 'finalmente' ... si el bloque finalmente pudo modificar ese valor, se derrotaría la seguridad / finalismo del bloque finalmente.

Es como una declaración de uso con un retorno dentro ... el " Dispose " todavía va a suceder, DESPUÉS del regreso (por así decirlo).

Finalmente siempre se ejecuta

Su código siempre se ejecuta finalmente sin importar si se produjo una excepción o no. Por lo tanto, su código debería ser:

try
{
    i = 1;
}
catch
{
    i = 2;
}
finally
{
    i = 3;
}
return i;

Pero en este caso trivial, finalmente bloquear no tendrá mucho sentido. Porque siempre devolveremos 3 sin importar lo que sucedió antes de eso.

Finalmente se usa para liberar recursos

El bloque

finalmente normalmente debe usarse cuando tiene que liberar algunos recursos del sistema asignados dentro del bloque try (es decir, abrir una conexión DB y leer datos en try bloquear y cerrarlo en finalmente ). Por lo tanto, siempre serán liberados sin importar si hubo una excepción o no. En este caso, no tiene mucho sentido usar el bloque finalmente .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top