Hoppa till innehåll

Villkor, switch och ternär operator

↑

Exemplen är oberoende C#-utdrag för moderna .NET-konsolprojekt, om inget annat anges. Klassdeklarationer och toppnivåkod kan placeras i samma Program.cs-fil, med toppnivåkoden först.

Flödeskontroll avgör vilka satser som körs. Välj den enklaste konstruktionen som tydligt uttrycker reglerna.

if kontrollerar ett booleskt uttryck. else if testas om tidigare villkor var falska. Ett avslutande else hanterar resten. Ordningen spelar roll om villkoren överlappar.

Example.cs
int score = 82;
if (score >= 90)
Console.WriteLine("Excellent");
else if (score >= 60)
Console.WriteLine("Passed");
else
Console.WriteLine("Try again");

switch passar när ett värde avgör flera olika fall. Mönstermatchning och vakter finns också, men en vanlig switch är ofta tydligast för menyval.

Example.cs
string command = "start";
switch (command)
{
case "start": Console.WriteLine("Running"); break;
case "stop": Console.WriteLine("Stopped"); break;
default: Console.WriteLine("Unknown command"); break;
}

Villkorsoperatorn villkor ? ja : nej returnerar ett av två uttryck. Använd den för korta tilldelningar, inte djupa nästlade regler. Ett switch-uttryck kan ge ett värde från flera fall.

Example.cs
int health = 0;
string state = health > 0 ? "Alive" : "Defeated";
string icon = state switch
{
"Alive" => "+",
_ => "x"
};
Console.WriteLine($"{state} {icon}");

Fördjupning: varje gren uttrycker ett designbeslut

Section titled “Fördjupning: varje gren uttrycker ett designbeslut”

En kedja med if/else if/else kontrollerar grenarna uppifrån och ned. Den första sanna grenen körs och resten hoppas över. Ordningen är därför viktig när regler överlappar. Om score >= 90 ska ge högsta betyg måste det testas före score >= 60. Ta med ett avslutande else när oväntade värden måste hanteras.

switch när ett värde bestämmer handlingen

Section titled “switch när ett värde bestämmer handlingen”

En switch-sats beskriver olika fall för ett givet värde. Ett switch-uttryck beräknar i stället ett värde och kan vara tydligare än att tilldela samma variabel i många grenar. Om alla enumvärden spelar roll bör du avgöra vad som ska hända för okända värden i stället för att tyst ignorera dem.

Program.cs
int score = 85;
string rank = score switch
{
>= 90 => "Gold",
>= 60 => "Silver",
>= 0 => "Bronze",
_ => "Invalid score"
};
Console.WriteLine(rank); // Silver

Exemplet använder relationsmönster. Grenarna matchas i ordning. Om de två första byter plats får även 95 poäng felaktigt nivån Silver.

condition ? whenTrue : whenFalse ger ett av två uttryck och passar en enkel tilldelning. Flera nästlade ternära operatorer blir snabbt svårlästa. Välj vanlig if eller ett switch-uttryck när reglerna blir mer komplicerade. Syftet är tydlighet, inte så få rader som möjligt.

Tänk på gränsvärden som noll, negativa tal, tom indata och okända enumvärden. När data kommer från spelare, filer eller nätverk bör den kontrolleras innan tillståndet ändras. Ett avslutande _-mönster, en guard clause eller ett undantag kan visa vad som ska hända om inget förväntat fall passar.

Använd if för intervall, switch för kända alternativ och ternär operator för enkla tvåvägsval.

Kontrollera ordningen vid överlappande villkor och undvik djupt nästlade ternära uttryck.

Skriv en regel som skriver Low under 20, Medium under 80 och annars High.

Visa ett lösningsförslag

if (value < 20) ... else if (value < 80) ... else ....