Инструкции (Руководство по программированию на 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 #{0} is {1}. Circumference = {2:N2}",
                                    counter, radius, circumference);

            // 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. unchecked Инструкции checked позволяют указать, разрешены ли числовые операции целочисленного типа вызвать переполнение при хранении результата в переменной, которая слишком мала, чтобы сохранить полученное значение.
Инструкция await Если пометить метод с помощью модификатора async, можно использовать в этом методе инструкцию await. Когда управление достигает выражения await в асинхронном методе, управление возвращается вызывающему объекту, и выполнение метода приостанавливается до завершения выполнения ожидающей задачи. После завершения задачи выполнение в методе может быть возобновлено.

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

Дополнительные сведения см. в разделе Итераторы.
Инструкция fixed Инструкция fixed не позволяет сборщику мусора переносить перемещаемую переменную. Дополнительные сведения см. в разделе fixed.
Инструкция lock Инструкция lock позволяет ограничить одновременный доступ к блокам кода только до одного потока. Дополнительные сведения см. в разделе 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#.

См. также