Поделиться через


Инструкции (руководство по программированию на C#)

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

Операция может состоять из одной строки кода, которая заканчивается точкой с запятой, или из ряда однострочных операций в блоке. Блок инструкций заключен в {} квадратные скобки и может содержать вложенные блоки. В следующем коде показаны два примера однострочных операторов и блок многострочных операторов.

    public static void Main()
    {
        // Declaration statement.
        int counter;

        // Assignment statement.
        counter = 1;

        // Error! This is an expression, not an expression statement.
        // counter + 1;

        // Declaration statements with initializers are functionally
        // equivalent to  declaration statement followed by assignment statement:
        int[] radii = [15, 32, 108, 74, 9]; // Declare and initialize an array.
        const double pi = 3.14159; // Declare and initialize  constant.

        // foreach statement block that contains multiple statements.
        foreach (int radius in radii)
        {
            // Declaration statement with initializer.
            double circumference = pi * (2 * radius);

            // Expression statement (method invocation). A single-line
            // statement can span multiple text lines because line breaks
            // are treated as white space, which is ignored by the compiler.
            System.Console.WriteLine($"Radius of circle #{counter} is {radius}. Circumference = {circumference:N2}");

            // Expression statement (postfix increment).
            counter++;
        } // End of foreach statement block
    } // End of Main method body.
} // End of SimpleStatements class.
/*
   Output:
    Radius of circle #1 = 15. Circumference = 94.25
    Radius of circle #2 = 32. Circumference = 201.06
    Radius of circle #3 = 108. Circumference = 678.58
    Radius of circle #4 = 74. Circumference = 464.96
    Radius of circle #5 = 9. Circumference = 56.55
*/

Типы высказываний

В следующей таблице перечислены различные типы инструкций в C# и связанные с ними ключевые слова с ссылками на разделы, содержащие дополнительные сведения:

Категория Ключевые слова C# и заметки
Инструкции объявления Инструкция объявления вводит новую переменную или константу. Объявление переменной может при необходимости назначить значение переменной. В объявлении константы требуется присваивание.
Инструкции выражений Операторы выражений, вычисляющие значение, должны хранить значение в переменной.
Операторы выбора Конструкции выбора позволяют выполнять переход в разные разделы кода в зависимости от одного или нескольких указанных условий. Дополнительные сведения см. в следующих разделах:
Операторы итерации Операторы итерации позволяют выполнять циклы по коллекциям, таким как массивы, или выполнять один и тот же набор инструкций многократно, пока не будет выполнено указанное условие. Дополнительные сведения см. в следующих разделах:
Операторы перехода Операторы перехода перенаправляют управление в другой раздел кода. Дополнительные сведения см. в следующих разделах:
Инструкции обработки исключений Инструкции обработки исключений позволяют корректно восстанавливаться после исключительных условий, возникающих во время выполнения. Дополнительные сведения см. в следующих разделах:
checked и unchecked Инструкции checked и unchecked позволяют указать, разрешено ли числовым операциям целочисленного типа вызывать переполнение, когда результат сохраняется в переменной, которая слишком мала, чтобы вместить это значение.
Инструкция await Если пометить метод с помощью модификатора async, можно использовать в этом методе инструкцию await. Когда управление достигает await выражения в асинхронном методе, оно возвращается вызывающей стороне, и ход выполнения метода приостанавливается до тех пор, пока ожидаемая задача не завершится. После завершения задачи выполнение в методе может быть возобновлено.

Для простого примера см. раздел Методы в "Асинхронные методы". Дополнительные сведения см. в статье "Асинхронное программирование с async и await".
Утверждение yield return Итератор выполняет настраиваемую итерацию по коллекции, например по списку или массиву. Итератор использует инструкцию yield return для возврата всех элементов по одному. После достижения инструкции запоминается текущее yield return расположение в коде. Выполнение перезапускается с этой позиции, когда итератор вызывается в следующий раз.

Дополнительные сведения см. в разделе Итераторы.
Заявление fixed Оператор fixed предотвращает перемещение сборщиком мусора перемещаемой переменной. Дополнительные сведения см. в разделе "Исправлено".
Инструкция lock Инструкция блокировки позволяет ограничить доступ к блокам кода только одному потоку за раз. Дополнительные сведения см. в разделе "Блокировка".
Инструкции с метками Вы можете дать инструкцию метку, а затем использовать ключевое слово goto для перехода к помеченной инструкции. (См. пример в следующей строке.)
Пустая инструкция Пустой оператор состоит из одной точки с запятой. Он ничего не делает и может использоваться там, где требуется утверждение, но не нужно выполнять никаких действий.

Инструкции объявления

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

// Variable declaration statements.
double area;
double radius = 2;

// Constant declaration statement.
const double pi = 3.14159;

Операторы выражений

В следующем коде показаны примеры операторов выражений, включая присваивание, создание объекта с присваиванием и вызовом метода.

// Expression statement (assignment).
area = 3.14 * (radius * radius);

// Error. Not  statement because no assignment:
//circ * 2;

// Expression statement (method invocation).
System.Console.WriteLine();

// Expression statement (new object creation).
System.Collections.Generic.List<string> strings =
    new System.Collections.Generic.List<string>();

Пустая инструкция

В следующих примерах показаны два использования для пустой инструкции:

void ProcessMessages()
{
    while (ProcessMessage())
        ; // Statement needed here.
}

void F()
{
    //...
    if (done) goto exit;
//...
exit:
    ; // Statement needed here.
}

Внедренные инструкции

Некоторые операторы, например, операторы итерации, всегда имеют встроенный оператор, следующий за ними. Эта встроенное утверждение может быть либо одним утверждением, либо несколькими утверждениями, заключенными в фигурные скобки в блоке утверждений. Даже однострочные внедренные инструкции могут быть заключены в {} квадратные скобки, как показано в следующем примере:

// Recommended style. Embedded statement in  block.
foreach (string s in System.IO.Directory.GetDirectories(
                        System.Environment.CurrentDirectory))
{
    System.Console.WriteLine(s);
}

// Not recommended.
foreach (string s in System.IO.Directory.GetDirectories(
                        System.Environment.CurrentDirectory))
    System.Console.WriteLine(s);

Внедренная инструкция, которая не заключена в {} скобки, не может быть инструкцией объявления или инструкцией с меткой. Это показано в следующем примере:

if(pointB == true)
    //Error CS1023:
    int radius = 5;

Поместите внедренную инструкцию в блок, чтобы устранить ошибку:

if (b == true)
{
    // OK:
    System.DateTime d = System.DateTime.Now;
    System.Console.WriteLine(d.ToLongDateString());
}

Вложенные блоки инструкций

Блоки инструкций могут вкладываться друг в друга, как показано в следующем коде:

foreach (string s in System.IO.Directory.GetDirectories(
    System.Environment.CurrentDirectory))
{
    if (s.StartsWith("CSharp"))
    {
        if (s.EndsWith("TempFolder"))
        {
            return s;
        }
    }
}
return "Not found.";

Недостижимые инструкции

Если компилятор определит, что поток управления никогда не достигнет конкретного оператора ни при каких обстоятельствах, он выдаст предупреждение CS0162, как показано в примере ниже.

// An over-simplified example of unreachable code.
const int val = 5;
if (val < 4)
{
    System.Console.WriteLine("I'll never write anything."); //CS0162
}

Спецификация языка C#

Дополнительные сведения см. в разделе "Инструкции " спецификации языка C#.

См. также