Вопрос

Учитывать,

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

Пример кода выводит «1».но значение i изменяется на 3 в блоке Final.Почему значение «i» не изменилось на 3?

Спасибо,

Это было полезно?

Решение

Рассмотрим этот код. Я думаю, что код объясняет, о чем вы думаете, и как вы можете сделать так, чтобы то, что, по вашему мнению, должно произойти, действительно произошло:

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

С помощью этого кода вы возвращаете 1 из метода, но вы также устанавливаете переменную счетчика на 3, к которой вы можете получить доступ вне метода.

Другие советы

Вы должны помнить, что функцияfinally выполняется после всего остального в попытке и поймать.Поместите оператор return после оператора try/catch/finally, чтобы он вернул 3.

Я предполагаю, что если вы используете ссылочный тип вместо типа значения, вы получите другое поведение.

Когда ты сказал "вернись я"...C# помещает это возвращаемое значение во временную область хранения (память), а затем запускает ваш «наконец» код...если бы блок «finally» смог изменить это значение, это нарушило бы безопасность/финализм блока «finally».

Это похоже на оператор использования с возвратом внутри...«Утилизация» все равно произойдет, ПОСЛЕ возвращения (так сказать).

Наконец всегда выполняется

Ваш код всегда выполняется в конечном итоге независимо от того, было ли выдано исключение или нет.Итак, ваш код на самом деле должен быть:

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

Но в этом тривиальном случае, наконец, блокировка не будет иметь особого смысла.Потому что мы всегда будем возвращать 3, независимо от того, что произошло до этого.

Наконец используется для освобождения ресурсов

finally Блок обычно следует использовать, когда вам нужно освободить некоторые системные ресурсы, выделенные внутри try блокировать (т.открытие соединения с БД и чтение данных в try заблокировать и закрыть его finally).Таким образом, они всегда будут освобождены, независимо от того, было ли исключение или нет.В этом случае нет смысла использовать finally блокировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top