Инструкции (Руководство по программированию на 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#.