Pergunta

Considere,

        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;
            }
        }

As saídas de código de exemplo "1". mas o valor de i é alterado para três em último bloco. Por que não foi o valor de 'i' alterado para 3?

Obrigado,

Foi útil?

Solução

Considere esta em código eu acho que o código explica o que você está pensando, e como você pode fazer o que você acha que deve acontecer realmente acontecer:

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;
  }
}

Com este código você retornar 1 a partir do método, mas você também definir a variável do contador para 3, que você pode acessar de fora do método.

Outras dicas

Você tem que lembrar que, finalmente, executa depois de tudo na tentativa e captura. Coloque a instrução de retorno após o try / catch / finally para tê-lo retornar 3.

Eu imagino que se você usar um tipo de referência, em vez de um tipo de valor que você deseja obter um comportamento diferente.

Quando você disse "voltar i" ... C # puts que valor de retorno em uma área de armazenamento temporário (memória) e em seguida, executa o código 'finalmente' ... se o último bloco foi capaz de modificar esse valor, seria derrotar a segurança / finalismo do bloco finally.

É como um usando declaração com um interior de retorno ... o "Descarte" ainda vai acontecer, após o retorno (por assim dizer).

Por fim é sempre executado

Seu código sempre executa finalmente, não importa se uma exceção foi acionada ou não. Portanto, o seu código deve realmente ser:

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

Mas neste caso trivial finalmente bloco não faz muito sentido. Porque nós sempre retornará 3 Não importa o que aconteceu antes disso.

Finalmente é usado para liberar recursos

bloco finally normalmente deve ser usado quando você tem que liberar alguns recursos do sistema alocados dentro do bloco try (ie. Openning uma conexão DB uma leitura de dados no bloco try e fechando-o em finally). Então, eles vão sempre ser liberado não importa se houve uma exceção ou não. Neste caso, não faz muito sentido para o bloco de uso finally.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top