Как выйти из функции в C#

  • Михаил
  • 8 мин. на прочтение
  • 161
  • 17 Jun 2024
  • 17 Jun 2024

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

Ниже приведены шесть операторов C#, отнесенных к категории операторов Jump.

  • break;
  • continue;
  • Environment.Exit()
  • goto;
  • return;
  • throw.

1. return

Самый распространенный способ - использовать ключевое слово return. Оно позволяет вернуть значение из функции и завершить ее выполнение. Оператор return завершает выполнение функции, в которой он появляется, а затем возвращает управление результату вызывающего метода, если он доступен. Однако если функция не имеет значения, оператор returnиспользуется без выражения.

public int Add(int a, int b)
{
    return a + b;
}

Еще пример

using System;
class Test {
 // Main Method
 static public void Main() {
   int[] Numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
   foreach (int number in Numbers) {
     // print only the first 10 numbers
     if (number > 10) {
       return;
     }
     return;
     Console.Write($"{number} ");
   }
 }
}

Если функция не возвращает значение (void), вы можете использовать return; для выхода из функции.

2. throw

Вы можете использовать ключевое слово throw, чтобы вызвать исключение и завершить выполнение функции. Исключения указывают на то, что произошла ошибка или изменилось выполнение программы. Оператор throwсоздает объект допустимого значения Exception classс использованием newключевого слова. Все классы исключений имеют свойства Stacktrace и Message. Обратите внимание, что допустимое исключение должно быть производным от класса Exception. Допустимый класс исключений включает ArgumentException, InvalidOperationException и NullReferenceException.IndexOutOfRangeException

public void Divide(int a, int b)
{
    if (b == 0)
        throw new DivideByZeroException("Cannot divide by zero");

    int result = a / b;
    Console.WriteLine($"Result: {result}");
}

Еще пример

using System;
class Test {
 // Main Method
 static public void Main() {
   int[] Numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
   foreach (int number in Numbers) {
     // using try catch block to
     // handle the Exception
     try {
       // print only the first 10 numbers
       if (number > 10) {
         Console.WriteLine();
         throw new NullReferenceException("Number is greater than 10");
       }
       Console.Write($"{number} ");
     } catch (Exception exp) {
       Console.WriteLine(exp.Message);
       return;
     }
   }
 }
}

3. Environment.Exit()
В редких случаях, когда вам нужно завершить выполнение всей программы, вы можете использовать Environment.Exit(0). Это немедленно завершает работу программы.

static void Main(string[] args)
{
    if (args.Length == 0)
    {
        Console.WriteLine("Please provide command line arguments.");
        Environment.Exit(1);
    }

    // Продолжить выполнение программы
}

4. break и continue
В циклах вы можете использовать break, чтобы выйти из текущего цикла, или continue, чтобы пропустить текущую итерацию и перейти к следующей. 

for (int i = 0; i < 10; i++)
{
    if (i == 5)
        continue; // Пропустить итерацию с i == 5

    if (i == 8)
        break; // Выйти из цикла
}

Оператор continue пропускает выполнение блока кода, если определенное условие истинно. В отличие от break оператора, continue оператор передает управление в начало цикла. Ниже приведен пример кода, использующего foreach метод.

using System;
class Test {
 // Main Method
 static public void Main() {
   int[] Numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
   foreach (int oddNumber in Numbers) {
     // print only the odd numbers 10 numbers
     if (oddNumber % 2 == 0) {
       continue;
     }
     Console.Write($"{oddNumber} ");
   }
 }
}

Оператор break останавливает цикл там, где он присутствует. Затем, если доступно, управление перейдет к оператору, следующему за завершенным оператором. Если break оператор присутствует во вложенном цикле, он завершает только те циклы, которые содержат оператор прерывания.

using System;
class Test {
 // Main Method
 static public void Main() {
   int[] Numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
   foreach (int number in Numbers) {
     // print only the first 10 numbers
     if (number > 10) {
       break;
     }
     Console.Write($"{number} ");
   }
 }
}

5. return в async-функциях
В асинхронных функциях, помеченных ключевым словом async, вы можете использовать return для возврата значения или завершения функции.

async Task GetValueAsync()
{
    await Task.Delay(1000);
    return 42;
}

6. goto

Мы используем этот goto оператор для передачи управления помеченному оператору в программе. Метка должна быть действительным идентификатором, помещенным перед gotoоператором.

Другими словами, он принудительно выполняет код на этикетке.

В приведенном ниже примере оператор goto вызывает выполнение случая 5.

using System;
class Test {
 // Main Method
 static public void Main() {
   int age = 18;
   switch (age) {
     case 5:
       Console.WriteLine("5yrs is less than the recognized age for adulthood");
       break;
     case 10:
       Console.WriteLine("Age 10 is still underage");
       break;
     case 18:
       Console.WriteLine("18yrs! You are now an adult and old enough to drink");
       // goto statement transfer
       // the control to case 5
       goto case 5;
     default:
       Console.WriteLine("18yrs is the recognized age for adulthood");
       break;
   }
 }
}

Выбор способа выхода из функции зависит от контекста и требований вашего кода. Используйте return для возврата значений, throw для обработки исключений, Environment.Exit() для завершения программы, а break и continue - в циклах.