Urvalsuttryck

Tip

Den här artikeln är en del av avsnittet Grunderna för utvecklare som redan känner till minst ett programmeringsspråk och lär sig C#. Om du inte har använt programmering tidigare börjar du med självstudierna Komma igång först. Fullständig syntax finns i urvalsinstruktioner i språkreferensen.

Kommer du från ett annat språk? C++, Java och JavaScript delar alla C:s arv, så if, elseoch switch läser samma i C#. Den enda skillnaden som är värd att notera: C# förbjuder genomfall mellan icke-tomma switch-grenar, och varje case-etikett kan testa mot ett mönster snarare än bara en konstant. Om du kommer från Python, motsvarar C#:s if/else if/else Pythons if/elif/else, och C#:s mönsterbaserade switch ligger närmast Pythons match-sats.

Valinstruktioner väljer vilket kodblock som körs baserat på ett villkor. C# innehåller två: if (med ett valfritt else) för förgrening på ett booleskt värde och switch för att jämföra ett värde med flera fall. Ett booleskt uttryck är ett uttryck som utvärderas till true eller false, till exempel jämförelsen temperature >= 25.

Förgrena med if och else

En if -instruktion kör endast dess block när dess booleska uttryck är true. Lägg till ett else block för att ange den kod som körs när villkoret är false:

int temperature = 28;

// An if statement runs its block only when the condition is true.
// The else block runs when the condition is false.
if (temperature >= 25)
{
    Console.WriteLine("Warm"); // => Warm
}
else
{
    Console.WriteLine("Cool");
}

Brödtexten för en if eller else är en enda instruktion, till exempel en tilldelning eller ett metodanrop. En block-instruktion är i sig en enda instruktion som omger noll eller fler instruktioner i klammerparenteser ({ }).

Många kodningsstandarder rekommenderar att du omger grenkropparna i klammerparenteser, även för en enda instruktion. Klamrar gör räckvidden explicit. Det förhindrar ett vanligt misstag: att du senare lägger till en andra rad som du förväntar dig ska köras villkorligt, men som i stället körs utan villkor. Det är bara klammerparenteserna som avgör vilka satser som tillhör grenen. C# behandlar inte blanktecken som betydelsebärande, så enbart indrag har aldrig den funktionen. Klammerparenteser är lagliga även runt en rad: blocket är den enda instruktion som grenen kör. Indentera koden för läsbarhet, men förlita dig på klammerparenteser för att avgränsa blocket.

Testa flera villkor med else if

Om du vill välja mellan fler än två sökvägar kedjar du villkor med else if. C# utvärderar varje villkor i ordning och kör det första blocket vars villkor är trueoch hoppar sedan över resten. En sista else hanterar alla återstående fall:

int score = 82;

// Chain conditions with else if. The first branch whose condition is
// true runs; the compiler skips the rest.
string grade;
if (score >= 90)
{
    grade = "A";
}
else if (score >= 80)
{
    grade = "B";
}
else if (score >= 70)
{
    grade = "C";
}
else
{
    grade = "F";
}

Console.WriteLine(grade); // => B

Ordning spelar roll i en kedja. Eftersom det första matchande villkoret vinner sätter du de mest specifika villkoren först. I föregående exempel innebär testning av score >= 80 före score >= 70 att en poäng på 82 motsvarar "B" i stället för "C".

Matcha ett värde med en switch instruktion

När du jämför ett värde med många diskreta fall, är en switch-sats tydligare än en lång else if-kedja. Precis som ifär -instruktionen switch en förgreningsuttryck: den väljer vilken kod som ska köras. Varje case etikett visar ett värde som ska matchas och varje case avsnitt slutar med en break instruktion. Stapla etiketter så att de delar samma brödtext, och använd avsnittet default för värden som inte matchar något fall:

DayOfWeek day = DayOfWeek.Saturday;

// A switch statement compares one value against several case labels.
// Stacked labels share a body. Each section ends with break, and the
// default section runs when no case matches.
switch (day)
{
    case DayOfWeek.Saturday:
    case DayOfWeek.Sunday:
        Console.WriteLine("Weekend"); // => Weekend
        break;
    default:
        Console.WriteLine("Weekday");
        break;
}

Till skillnad från C och Java tillåter C# inte att körningen fortsätter från ett icke-tomt avsnitt case till nästa. Varje avsnitt som innehåller kod måste sluta med en break (eller en annan jump-instruktion, till exempel return eller goto). Den här regeln förhindrar oavsiktliga buggar som är vanliga på dessa språk.

Testa mönster med case och when

En case etikett är inte begränsad till konstanta värden. Den kan testa ett mönster, vilket är en regel som beskriver dataformen eller värdet. Ett relationsmönster såsom < 0 matchar alla värden som är mindre än noll. Lägg till en when sats för att bifoga ett extra villkor som också måste vara true för att ärendet ska matcha:

int measurement = 42;

// A case label can test a pattern instead of a constant. A when clause
// adds a condition that must also be true for the case to match.
switch (measurement)
{
    case < 0:
        Console.WriteLine("Negative");
        break;
    case 0:
        Console.WriteLine("Zero");
        break;
    case > 0 when measurement % 2 == 0:
        Console.WriteLine("Positive and even"); // => Positive and even
        break;
    default:
        Console.WriteLine("Positive and odd");
        break;
}

Mönsterbaserade fall utvärderas uppifrån och ned, så mer specifika mönster hör hemma före mer allmänna. Den fullständiga katalogen med mönster finns i mönstermatchning.

Välj ett värde med ett uttryck

Instruktionen if och switch bestämmer vilken kod som ska köras. När du i stället behöver välja ett värde använder du ett uttryck. Ett uttryck utvärderas till ett värde, så du kan använda det var som helst där ett värde förväntas, till exempel höger sida av en tilldelning eller ett metodargument. C# erbjuder uttrycksformulär som väljer ett värde från alternativ som villkorsoperatorn och switch uttrycket.

Villkorsoperator ?:

Villkorsoperatorn ?: väljer ett av två värden baserat på ett booleskt villkor.

Dess syntax, kortslutningsbeteende och vägledning om hur du väljer den i stället för finns i if/elseVillkorsoperatorn ?:.

switch uttryck

Ett switch-uttryck är uttrycksmotsvarigheten till satsen switch. I stället för att köra kod för det matchande fallet utvärderas det till ett värde. Det är mer koncist än att tilldela ett värde i varje arm i en switch -instruktion, och kompilatorn varnar dig när armarna inte täcker alla möjliga indata. Uttrycket switch är en viktig del av mönstermatchningen. Information om när och hur du använder det finns i mönstermatchning och uttrycksreferensenswitch.

Se även