Statements#

The if, for, while, and do while statements look identical to those in C++. The only difference is the logical condition in these statements, which must evaluate to a boolean value.

The switch statement#

Unlike in C++, the switch statement in C# does not allow control to fall through from one case block to the next implicitly. However, you can attach multiple case labels to a single block.

In addition to matching constants, the switch statement can use pattern matching for any pattern. You can find a full list of them in the Patterns lecture.

Additionally, after the pattern, we can provide an additional condition that will be considered after the pattern is checked.

switch (expression)
{
    case pattern:
        statement list
    case pattern:
    case pattern when condition: // optional case guard
        statement list
    default:
        statement list
}

An example of a statement with the two most commonly used types of patterns and an optional condition:

void TellMeAboutTheObject(object obj)
{
    switch (obj)
    {
        case 0: // constant pattern
            Console.WriteLine("It's a zero.");
            break;
        case string str: // type pattern
            Console.WriteLine($"It's a string: {str}");
            break;
        // type pattern with case guard
        case DateTime dt when dt.DayOfWeek == DayOfWeek.Monday:
            Console.WriteLine("It's a Monday");
            break;
        default:
            Console.WriteLine("IDK");
            break;
    }
}

The switch expression#

The switch expression is more concise and is used to return a single value based on pattern matching.

In this case, every case must be handled; otherwise, the runtime throws an exception. The equivalent of default in a switch expression is the discard pattern _.

type variable = input expression switch
{
    pattern => candidate expression ,
    pattern when condition => candidate expression ,
    pattern => candidate expression
}

Example:

string cardName = cardNumber switch
{
    13 => "King", // constant pattern
    12 => "Queen",
    11 => "Jack",
    > 1 and < 11 => "Pip card", // relational pattern
    1 => "Ace",
    // discard pattern, equivalent of default:
    _ => throw new ArgumentOutOfRangeException()
};

The foreach statement#

Similar to C++, in C# we have a range for loop, but with a slightly different syntax. It can be used on anything that is iterable. For example, all built-in collections, arrays, and strings are iterable. We will discuss what makes something iterable later when talking about enumerators.

int[] array = new int[] {0, 1, 2, 3, 4};
foreach (var i in array)
    Console.WriteLine(i);
foreach (char c in "foreach")
    Console.WriteLine(c);