Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wskazówka
Ten artykuł jest częścią sekcji Podstawy dla deweloperów, którzy już znają co najmniej jeden język programowania i uczą się języka C#. Jeśli dopiero zaczynasz programować, najpierw zacznij od samouczków Wprowadzenie . Aby uzyskać pełną składnię, zobacz instrukcje wyboru w dokumentacji języka.
Pochodzi z innego języka? Języki C++, Java i JavaScript współdzielą dziedzictwo języka C, dlatego if, elsei switch czytają to samo w języku C#. Jedna różnica, którą warto zauważyć: język C# zabrania przechodzenia między niepustymi przypadkami switch, a każda etykieta case może sprawdzać wzorzec, a nie tylko stałą. Jeśli znasz Pythona, to if/else if/else w C# odpowiada if/elif/else, a oparte na wzorcach switch w C# jest najbliższe instrukcji match w Pythonie.
Instrukcje wyboru określają, który blok kodu zostanie wykonany w zależności od warunku. Język C# oferuje dwie konstrukcje: if (z opcjonalnym else) do rozgałęziania na podstawie wartości logicznej oraz switch do porównywania jednej wartości z kilkoma przypadkami.
Wyrażenie logiczne to dowolne wyrażenie, które przyjmuje wartość true lub false, na przykład porównanie temperature >= 25.
Utwórz gałąź z if i else
Instrukcja if wykonuje swój blok tylko wtedy, gdy wyrażenie boolowskie ma wartość true.
else Dodaj blok, aby podać kod, który jest uruchamiany, gdy warunek to 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");
}
Treść elementu if lub else jest pojedynczą instrukcją, taką jak przypisanie lub wywołanie metody.
Instrukcja blokowa sama w sobie jest pojedynczą instrukcją, która obejmuje zero lub więcej instrukcji ujętych w nawiasy klamrowe ({ }).
Wiele standardów kodowania zaleca, aby ująć jednostki gałęzi w nawiasy klamrowe, nawet w przypadku pojedynczej instrukcji. Nawiasy klamrowe sprawiają, że zakres jest jawny. Zapobiega to częstemu błędowi: późniejszemu dodaniu drugiej linii, co do której oczekujesz, że zostanie wykonana warunkowo, ale zamiast tego jest wykonywana bezwarunkowo. Tylko nawiasy klamrowe decydują, które instrukcje należą do gałęzi. Język C# nie traktuje białych znaków za istotne, więc samo wcięcie również nigdy nie ma znaczenia. Nawiasy klamrowe są legalne nawet w jednym wierszu: blok jest pojedynczą instrukcją, że gałąź jest uruchamiana. Stosuj wcięcia w kodzie dla czytelności, ale do definiowania bloku używaj nawiasów klamrowych.
Testuj kilka warunków za pomocą else if
Aby wybrać spośród ponad dwóch ścieżek, połącz warunki za pomocą else if. Język C# ocenia każdy warunek w kolejności i uruchamia pierwszy blok, którego warunek to true, a następnie pomija resztę. Na końcu else obsługuje wszystkie pozostałe przypadki:
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
Kolejność ma znaczenie w łańcuchu. Ponieważ obowiązuje pierwszy pasujący warunek, najbardziej szczegółowe warunki umieść na początku. W poprzednim przykładzie sprawdzenie score >= 80 przed score >= 70 zapewnia, że wynik 82 jest przypisywany do "B", a nie do "C".
Dopasuj wartość za pomocą instrukcji switch
Gdy porównujesz pojedynczą wartość z wieloma oddzielnymi przypadkami, instrukcja switch jest czytelniejsza niż długi ciąg instrukcji else if. Podobnie jak if, instrukcja switch jest instrukcją rozgałęziającą: wybiera, który kod ma zostać wykonany. Każda etykieta case zawiera wartość do dopasowania, a każda sekcja case kończy się instrukcją break. Umieść etykiety razem, aby współdzieliły jedną treść, i użyj sekcji default dla wartości, które nie pasują do żadnego przypadku:
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;
}
W przeciwieństwie do języka C i Javy język C# nie zezwala na przejście wykonania z jednej niepustej case sekcji do następnej. Każda sekcja zawierająca kod musi kończyć się znacznikiem break (lub inną instrukcją skoku, taką jak return lub goto). Ta reguła uniemożliwia przypadkowe błędy występujące w tych językach.
Wzorce testowe z użyciem case i when
Etykieta case nie jest ograniczona do wartości stałych. Może przetestować wzorzec, który jest regułą opisającą kształt lub wartość danych. Wzorzec relacyjny, taki jak < 0 pasuje do dowolnej wartości mniejszej niż zero. Dodaj klauzulę when, aby dodać dodatkowy warunek, który również musi być true, aby przypadek pasował:
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;
}
Przypadki oparte na wzorcu są oceniane od góry do dołu, więc bardziej szczegółowe wzorce należą przed bardziej ogólnymi. Aby zapoznać się z pełnym wykazem wzorców, zobacz dopasowywanie wzorców.
Wybieranie wartości z wyrażeniem
Instrukcje if i switch decydują, który kod jest uruchamiany. Jeśli zamiast tego musisz wybrać wartość, użyj wyrażenia. Wyrażenie przyjmuje wartość, więc można go użyć wszędzie tam, gdzie oczekiwana jest wartość, na przykład po prawej stronie przypisania lub jako argument metody. Język C# oferuje formularze wyrażeń, które wybierają wartość z alternatyw, takich jak operator warunkowy switch i wyrażenie.
Operator warunkowy ?:
Operator ?: warunkowy wybiera jedną z dwóch wartości na podstawie warunku logicznego.
Informacje o jego składni, zachowaniu zwarciowym i wskazówkach dotyczących wyboru tego operatora zamiast if/else można znaleźć w artykule operator ?:warunkowy.
wyrażenie switch
Wyrażenie switch jest odpowiednikiem instrukcji switch w postaci wyrażenia. Zamiast wykonywać kod dla pasującego przypadku, zwraca wartość. Jest to bardziej zwięzłe niż przypisywanie wartości w każdym ramieniu instrukcji switch, a kompilator ostrzega, gdy ramiona nie obejmują wszystkich możliwych wartości wejściowych. Wyrażenie switch jest główną częścią dopasowywania wzorca. Aby dowiedzieć się, kiedy i jak go używać, zobacz dopasowywanie wzorców i switch odwołanie do wyrażenia.