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 właściwości i wzorce pozycyjne w dokumentacji języka.
Zarówno wzorce właściwości, jak i wzorce pozycyjne sprawdzają części wartości. Różnica polega na tym, jak identyfikują te części:
- Wzorzec właściwości nazywa właściwości lub pola do przetestowania.
- Wzorzec pozycyjny identyfikuje wartości według ich kolejności.
Dekonstrukcja uwidacznia uporządkowany zestaw wartości składników. Krotka ma już uporządkowanie elementów; zobacz dekonstruowanie krotek. W przypadku innego typu metoda definiuje, Deconstruct które wartości składników są uwidocznione i ich kolejność.
Porównywanie nazw i pozycji
Następujący wzorzec właściwości testuje dwie nazwane właściwości odczytu pogody z wartościami temperatury w stopniach Celsjusza:
static bool IsHotAndHumid(WeatherReading reading) =>
reading is { TemperatureC: > 30, HumidityPercent: > 70 };
sealed record WeatherReading(int TemperatureC, int HumidityPercent);
Następujący wzorzec pozycyjny sprawdza wartość sygnału, a po niej wartość logiczną:
static string GetCrossingInstruction(
PedestrianSignal signal, bool crossingIsClear) =>
(signal, crossingIsClear) switch
{
(PedestrianSignal.Walk, true) => "Cross now",
(PedestrianSignal.Walk, false) => "Wait for the crossing to clear",
_ => "Wait for the walk signal"
};
enum PedestrianSignal
{
Stop,
Walk
}
Wzorzec właściwości identyfikuje swoje dane wejściowe według nazw TemperatureC i HumidityPercent. Kod krzyżowania tworzy krotkę z osobnych wartości signal i crossingIsClear. Wzorzec krotki następnie identyfikuje te wartości w podanej kolejności: signal jako pierwszą, a crossingIsClear jako drugą. Wzorzec pozycyjny dobrze się tu sprawdza, ponieważ ta nowo utworzona krotka ma tylko dwie wartości, a ich kolejność ma wyraźne znaczenie przy podejmowaniu decyzji o przejściu.
Wybierz wzorzec właściwości, gdy nazwy elementów członkowskich pomagają wyjaśnić test. Wzorce właściwości są zwykle jaśniejsze dla klas, struktur i rekordów. Wybierz wzorzec pozycyjny, gdy kolejność już nadaje wartościom oczywiste znaczenie. Wzorce pozycyjne są najbardziej przydatne w krotkach, które łączą wiele powiązanych wartości w jedną wartość ze stałą kolejnością.
Obserwowanie zagnieżdżonych danych wejściowych we wzorcach cyklicznych
Wzorce właściwości i wzorce pozycyjne to wzorce rekurencyjne: dopasowują inny wzorzec do każdej właściwości, każdego pola lub każdej pozycji, które wybierają. Wybrana wartość staje się danymi wejściowymi tego zagnieżdżonego wzorca.
W IsHotAndHumid wyrażenie reading stanowi dane wejściowe dla wzorca właściwości. Język C# oblicza to wyrażenie przed dopasowaniem. Wzorzec pobiera dwie wartości z wynikowego obiektu:
- Wzorzec
> 30relacyjny sprawdza wartośćTemperatureC. - Wzorzec
> 70relacyjny sprawdza wartośćHumidityPercent.
Test typu zewnętrznego jest opcjonalny, a klauzule wzorca cyklicznego mogą być puste. Na przykład wzorzec { } pustej właściwości jest zgodny z dowolną obliczoną wartością inną niż null.
Wzorce właściwości i wzorce pozycyjne dopasowują tylko obliczone wartości różne od null. Gdy null jest częścią domeny wejściowej, wybierz wzorzec rekursywny, który najpierw sprawdza wartość inną niż null:
static string DescribeNullableInput(object? value)
{
if (value is not { } nonNullValue)
{
return "No value";
}
return nonNullValue switch
{
DateTime => "Date",
string => "Text",
_ => "Another type"
};
}
Wyrażenie wejściowe to value. C# oblicza ją, a wzorzec właściwości { } sprawdza, czy wynikowa wartość nie jest równa null, przed przypisaniem jej do nonNullValue. Poniższe wyrażenie przełącznika może następnie przetestować wiele możliwych typów środowiska uruchomieniowego. Wzorce typów DateTime i string nie mają oznacznika, ponieważ metoda musi jedynie rozpoznawać każdy typ, a nie przechwytywać jego wartość.
Gdy klauzule wzorca cyklicznego zawierają zagnieżdżone wzorce, każda wybrana właściwość, pole lub pozycja stają się danymi wejściowymi do zagnieżdżonego wzorca.
Przed nawiasami klamrowymi można dodać sprawdzenie typu, gdy wyrażenie wejściowe może zwracać różne typy. Możesz również użyć ścieżki składowej do przetestowania właściwości zagnieżdżonej:
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
value jest wyrażeniem wejściowym. Język C# najpierw oblicza jego wartość i sprawdza, czy otrzymana wartość jest DateTime. Wartość właściwości Date staje się następnie danymi wejściowymi dla odwołania do składowej DayOfWeek. Na koniec wartość DayOfWeek staje się argumentem wejściowym wzorca logicznego, który sprawdza dwie stałe. Dopasowanie kończy się powodzeniem, gdy wartość zewnętrzna ma określony typ, a każdy obiekt wymagany wzdłuż ścieżki elementu członkowskiego ma wartość inną niż null.
Porównywanie wzorców z instrukcjami rozgałęziania
Wcześniejsza DescribeDate metoda wyraża cztery wyniki jako wzorce:
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
Poniższa metoda generuje te same wyniki z serią instrukcji rozgałęziania imperatywnego:
static string DescribeDateWithBranches(object? value)
{
if (value is DateTime date)
{
if (date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday)
{
return "Weekend date";
}
return "Weekday date";
}
if (value is null)
{
return "No date";
}
return "Not a date";
}
Wersja oparta na wzorcu zachowuje możliwe wyniki razem, gdy kilka gałęzi testuje typ i kształt wartości. Wersja imperatywne sprawia, że każdy test i krok powrotu są jawne. W przypadku jednego warunku dowolny formularz może wyglądać podobnie. Wraz ze wzrostem liczby powiązanych gałęzi wzorce mogą ułatwić porównywanie alternatyw.