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#. Zacznij od omówienia dopasowywania wzorców, jeśli wzorce są dla Ciebie nowe. Aby uzyskać pełne reguły języka, zobacz wzorce relacyjne i wzorce logiczne w dokumentacji języka.
Wzorce relacyjne i logiczne opisują zakresy, alternatywy i wykluczenia. Poniższa metoda łączy je w celu sklasyfikowania temperatury:
static string ClassifyTemperature(int temperature) =>
temperature switch
{
< 0 => "Below freezing",
>= 18 and <= 24 => "Comfortable",
(>= 0 and < 10) or > 30 => "Far outside the comfortable range",
_ => "Cool or warm"
};
Wyrażenie temperature to dane wejściowe wzorca. C# oblicza to raz, a każde ramię instrukcji switch testuje uzyskaną wartość. Broń demonstruje te testy:
-
< 0testuje jedną wartość graniczną. -
>= 18 and <= 24sprawdza zakres. -
(>= 0 and < 10) or > 30testuje dwa alternatywne zakresy.
W tym artykule przedstawiono zarówno wzorce, jak i warunki imperatywne, dzięki czemu można nauczyć się każdego formularza i porównać sposób wyrażania tych samych decyzji. Pojedynczy warunek może wyglądać podobnie w obu formularzach. Wzorce mogą ułatwić odczytywanie szeregu powiązanych gałęzi, zachowując opcje obok wyników. Wybierz formularz, który ułatwia zrozumienie kodu.
Porównywanie wartości z wzorcami relacyjnymi
Wzorzec relacyjny porównuje wartość wejściową wzorca ze stałą znaną w czasie kompilacji przy użyciu <, <=, > lub >=.
Stała czasu kompilacji to wartość, która kompilator może ocenić podczas kompilowania programu. Literały liczbowe i literały znakowe oraz zmienne const zgodnych typów liczbowych lub znakowych stanowią typowe przykłady. Zwykłe zmienne, właściwości, wywołania metod i pola static readonly nie są stałymi znanymi w czasie kompilacji. W początkowym przykładzie zarówno >= 18, jak i <= 24 testują tę samą obliczoną wartość temperature.
Ten sam symbol relacyjny może występować w zwykłym wyrażeniu lub w wzorcu. W poniższym przykładzie użyto obu form zapisu temperatury:
static void ShowExpressionAndPattern(int temperature, int threshold)
{
bool belowThreshold = temperature < threshold;
bool belowFreezing = temperature is < 0;
string description = temperature switch
{
< 0 => "Freezing",
0 => "Freezing point",
> 0 => "Above freezing"
};
Console.WriteLine(
$"Below threshold: {belowThreshold}; " +
$"below freezing: {belowFreezing}; {description}");
}
temperature < threshold jest wyrażeniem relacyjnym. Ocenia on zarówno operandy, jak i generuje element bool. Jeden z operandów może być niekonstantym wyrażeniem.
W temperature is < 0, temperature jest wejściowym wyrażeniem wzorca. Język C# ocenia go, a wzorzec < 0 relacyjny testuje wynikową wartość. W ramieniu przełącznika < 0 => "Freezing" wyrażenie przed switch stanowi dane wejściowe, więc wzorzec zawiera tylko < 0.
Wyrażenie może być porównywane temperature ze zmienną threshold. Operand wzorca relacyjnego musi być stałą znaną w czasie kompilacji, dlatego gdy porównywana wartość jest zmienną, należy użyć wyrażenia porównania. Gdy wartość porównania jest stała, dowolny formularz może działać.
Gdy prawy operand jest stały, kieruj się głównie czytelnością. Wyrażenie relacyjne często pasuje do jednego bezpośredniego porównania. Wzorzec relacyjny można łączyć z innymi wzorcami i sprawdza się szczególnie wtedy, gdy kilku zakresom odpowiadają wyniki wyrażenia switch.
Łączenie warunków z wzorcami logicznymi
Wzorce logiczne łączą lub negują wzorce za pomocą operatorów wzorców and, or i not:
- Wzorzec
andjest zgodny, gdy oba zagnieżdżone wzorce są zgodne. - Wzorzec
orpasuje, gdy pasuje jeden z zagnieżdżonych wzorców. - Wzorzec kończy się powodzeniem
not, gdy jego zagnieżdżony wzorzec zakończy się niepowodzeniem.
W pierwszym przykładzie użyto and do opisania zakresu i or do opisania alternatyw. Wzorzec not może wykluczyć wartość, tak jak w pliku status is not Status.Complete. Poniższe metody pokazują obie formy, aby poznać ich składnię i porównać sposób wyrażania tego samego testu:
static bool IsWeekendPattern(DayOfWeek day) =>
day is DayOfWeek.Saturday or DayOfWeek.Sunday;
static bool IsWeekendImperative(DayOfWeek day) =>
day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;
Formularz szablonu używa dwóch stałych szablonów połączonych za pomocą or. Forma imperatywna używa dwóch wyrażeń równości połączonych operatorem alternatywy warunkowej ||. Oba formularze są zwięzłe i jasne dla tego pojedynczego warunku. Wybierz formularz, który najlepiej pasuje do otaczającego kodu. Wzorce często wyjaśniają kilka powiązanych opcji w elemecie switch, jak w przykładzie otwierającym.
Operatory wzorców tworzą wzorce, a nie wyrażenia logiczne: and odpowiada połączeniu wzorca, or alternatywom wzorców i not negacji wzorca. W wyrażeniach logicznych używa się &&, || i !. Wybierz or , kiedy kilka alternatywnych wzorców ma ten sam wynik. Wybór not podczas wyrażania wykluczonego wzorca jest jaśniejszy niż wyświetlanie listy każdej zaakceptowanej wartości.
Wzorce grupowania z nawiasami
Wzorzec ujęty w nawiasy używa nawiasów do wskazywania lub zmiany sposobu grupowania zagnieżdżonych wzorców. Wiązanie określa, które operandy wzorca operator grupuje razem, podobnie jak niejawne grupowanie, gdy nie używasz nawiasów. Język C# określa następującą kolejność powiązań:
notandor
Poniższy test akceptuje priorytety od 1 do 3 lub specjalny priorytet 9:
static bool IsAcceptedPriority(int priority) =>
priority is (>= 1 and <= 3) or 9;
Kompilator grupuje and przed or. Nawiasy sprawiają, że zamierzone grupowanie jest jawne, a dwie alternatywy są łatwe do zobaczenia: zakres od 1 do 3 lub 9. Aby zapewnić czytelność, należy używać nawiasów zawsze, gdy wzorzec łączy and i or lub gdy not odnosi się do wzorca złożonego. Nawiasy mogą również zmieniać domyślne grupowanie, tak jak w pliku not (>= 1 and <= 3).
Kolejność sprawdzania w czasie wykonywania dla wzorców zagnieżdżonych jest nieokreślona, a operatory wzorców podlegają regułom dopasowywania wzorców, a nie regułom logiki krótkiego spięcia. Zapisuj zagnieżdżone wzorce, aby ich wynik był niezależny od kolejności sprawdzania.
Używanie ochrony dla when oddzielnego warunku
Wzorce logiczne działają najlepiej, gdy zagnieżdżone wzorce opisują samą wartość wejściową. Ochrona when jest dodatkowym warunkiem logicznym na etykiecie lub ramieniu przełącznika case . Użyj ochrony, gdy decyzja zależy również od informacji oddzielnych od danych wejściowych wzorca.
Następujące ostrzeżenie zależy od temperatury i oddzielnej isOutdoors wartości:
static string GetHeatWarning(int temperature, bool isOutdoors) =>
temperature switch
{
> 35 when isOutdoors => "High heat outdoors",
> 35 => "High heat",
_ => "No heat warning"
};
Wzorzec > 35 relacyjny opisuje temperature dane wejściowe. Funkcja straży when isOutdoors sprawdza oddzielną wartość. Warunek ochronny jest również zalecany, gdy warunek wymaga wywołania metody lub wyrażenia logicznego, którego składnia wzorca nie wyraża jasno.
Używaj wzorców relacyjnych i logicznych, gdy ułatwiają one wyświetlanie kształtów lub wartości danych wejściowych, szczególnie w kilku ramionach przełącznika. Użyj zwykłego wyrażenia logicznego, gdy pozwala ono prościej wyrazić warunek bezpośredni.
when Użyj ochrony, gdy wybór przełącznika zależy od oddzielnej wartości lub warunku lepiej wyrażonego jako wyrażenie logiczne.