Question

Envisagez,

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

L'exemple de code génère "1". mais la valeur de i est changée à 3 dans le bloc enfin. Pourquoi la valeur de 'i' n'a-t-elle pas été modifiée à 3?

Merci,

Était-ce utile?

La solution

Considérez ce code. Je pense que le code explique ce que vous pensez et comment vous pouvez faire en sorte que ce qui devrait selon vous arriver se produise réellement:

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

Avec ce code, vous renvoyez 1 depuis la méthode, mais vous définissez également la variable counter à 3, à laquelle vous pouvez accéder de l'extérieur de la méthode.

Autres conseils

Vous devez vous rappeler que finalement s’exécute après tout le reste dans l’essai et la capture. Placez l'instruction return après l'instruction try / catch / finally pour qu'elle retourne 3.

J'imagine que si vous utilisez un type de référence au lieu d'un type de valeur, vous obtiendrez un comportement différent.

Lorsque vous avez dit "return i" ... C # place cette valeur de retour dans une zone de stockage temporaire (mémoire), puis lance votre code "finally" ... si le bloc finally a pu modifier cette valeur, il vaincrait la sécurité / le finalisme du bloc final.

C’est comme une déclaration using avec un retour à l'intérieur ... le "Dispose" va encore se produire, après le retour (pour ainsi dire).

Enfin est toujours exécuté

Votre code s’exécute toujours finalement, peu importe si une exception a été levée ou non. Donc, votre code devrait être réellement:

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

Mais dans ce cas trivial, finalement, bloquer n'aura pas beaucoup de sens. Parce que nous retournerons toujours 3, peu importe ce qui s’est passé avant.

Enfin utilisé pour libérer des ressources

Le bloc

finally devrait normalement être utilisé lorsque vous devez libérer certaines ressources système allouées dans le bloc try (c'est-à-dire ouvrir une connexion à une base de données et lire des données dans try bloquer et le fermer dans enfin ). Ainsi, ils seront toujours libérés, qu’il y ait eu une exception ou non. Dans ce cas, il n’a pas beaucoup de sens d’utiliser le bloc finally .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top