Instrukcje

Instrukcje #

Instrukcje if, for, while i do while wyglądają identycznie jak w C++. Jedyną różnicą jest warunek logiczny w tych instrukcjach, który musi się ewaluuować do wartości boolowskiej.

Instrukcja switch #

W przeciwieństwie do C++, instrukcja switch w C# nie pozwala na niejawne przejście kontroli z jednego bloku case do następnego. Można natomiast przyczepić wiele etykiet case do jednego bloku.

Poza dopasowaniem do stałych, instrukcja switch może używać dopasowywania do dowolnego wzorca. Więcej o wzorcach później.

Dodatkowo po wzorcu możemy podać dodatkowy warunek który będzie rozważany dodatkowo po sprawdzeniu wzorca.

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

Przykład instrukcji z dwoma najczęściej używanymi typami wzorców i opcjonalnym warunkiem:

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;
    }
}

Wyrażenie switch #

Wyrażenie switch jest bardziej zwięzłe i służy do zwracania pojedynczej wartości na podstawie dopasowania do wzorca.

W tym przypadku każdy case musi zostać obsłużony, w przeciwnym wypadku runtime rzuca wyjątkiem. Odpowiednikiem default w wyrażeniu switch jest wzorzec odrzucenia (discard) _.

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

Przykład:

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()
};

Instrukcja foreach #

Podobnie jak w C++ mamy w c# range for loopa, ma trochę inną składnię. Można go używać na wszystkim co jest iterowalne. Iterowalne są np. wszystkie kolekcje wbudowane, tablice i stringi. Czym jest iterowalność powiemy sobie później.

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