Statements (C# Programming Guide)


Updated: July 20, 2015

System_CAPS_ICON_note.jpg Note

For the latest documentation on C#, visit the C# Guide on

The actions that a program takes are expressed in statements. Common actions include declaring variables, assigning values, calling methods, looping through collections, and branching to one or another block of code, depending on a given condition. The order in which statements are executed in a program is called the flow of control or flow of execution. The flow of control may vary every time that a program is run, depending on how the program reacts to input that it receives at run time.

A statement can consist of a single line of code that ends in a semicolon, or a series of single-line statements in a block. A statement block is enclosed in {} brackets and can contain nested blocks. The following code shows two examples of single-line statements, and a multi-line statement block:

        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).

            } // End of foreach statement block
        } // End of Main method body.
    } // End of SimpleStatements class.
        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

The following table lists the various types of statements in C# and their associated keywords, with links to topics that include more information:

CategoryC# keywords / notes
Declaration statementsA declaration statement introduces a new variable or constant. A variable declaration can optionally assign a value to the variable. In a constant declaration, the assignment is required.

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

                // Constant declaration statement.
                const double pi = 3.14159;
Expression statementsExpression statements that calculate a value must store the value in a variable.

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

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

                // Expression statement (method invocation).

                // Expression statement (new object creation).
                System.Collections.Generic.List<string> strings =
                    new System.Collections.Generic.List<string>();
Selection statementsSelection statements enable you to branch to different sections of code, depending on one or more specified conditions. For more information, see the following topics:

 if, else, switch, case
Iteration statementsIteration statements enable you to loop through collections like arrays, or perform the same set of statements repeatedly until a specified condition is met. For more information, see the following topics:

 do, for, foreach, in, while
Jump statementsJump statements transfer control to another section of code. For more information, see the following topics:

 break, continue, default, goto, return, yield
Exception handling statementsException handling statements enable you to gracefully recover from exceptional conditions that occur at run time. For more information, see the following topics:

 throw, try-catch, try-finally, try-catch-finally
Checked and uncheckedChecked and unchecked statements enable you to specify whether numerical operations are allowed to cause an overflow when the result is stored in a variable that is too small to hold the resulting value. For more information, see checked and unchecked.
he await statementIf you mark a method with the async modifier, you can use the await operator in the method. When control reaches an await expression in the async method, control returns to the caller, and progress in the method is suspended until the awaited task completes. When the task is complete, execution can resume in the method.

For a simple example, see the "Async Methods" section of Methods. For more information, see Asynchronous Programming with Async and Await.
The yield return statementAn iterator performs a custom iteration over a collection, such as a list or an array. An iterator uses the yield return statement to return each element one at a time. When a yield return statement is reached, the current location in code is remembered. Execution is restarted from that location when the iterator is called the next time.

For more information, see Iterators.
The fixed statementThe fixed statement prevents the garbage collector from relocating a movable variable. For more information, see fixed.
The lock statementThe lock statement enables you to limit access to blocks of code to only one thread at a time. For more information, see lock.
Labeled statementsYou can give a statement a label and then use the goto keyword to jump to the labeled statement. (See the example in the following row.)
The empty statementThe empty statement consists of a single semicolon. It does nothing and can be used in places where a statement is required but no action needs to be performed. The following examples show two uses for an empty statement:

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

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

Some statements, including do, while, for, and foreach, always have an embedded statement that follows them. This embedded statement may be either a single statement or multiple statements enclosed by {} brackets in a statement block. Even single-line embedded statements can be enclosed in {} brackets, as shown in the following example:

                // Recommended style. Embedded statement in  block.
                foreach (string s in System.IO.Directory.GetDirectories(

                // Not recommended.
                foreach (string s in System.IO.Directory.GetDirectories(

An embedded statement that is not enclosed in {} brackets cannot be a declaration statement or a labeled statement. This is shown in the following example:

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

Put the embedded statement in a block to fix the error:

                if (b == true)
                    // OK:
                    System.DateTime d = System.DateTime.Now;

Statement blocks can be nested, as shown in the following code:

                foreach (string s in System.IO.Directory.GetDirectories(
                    if (s.StartsWith("CSharp"))
                        if (s.EndsWith("TempFolder"))
                            return s;

                return "Not found.";

If the compiler determines that the flow of control can never reach a particular statement under any circumstances, it will produce warning CS0162, as shown in the following example:

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

For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.

C# Programming Guide