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.
Porada
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 zgodności, zobacz deklarację i wzorce typów w dokumentacji języka.
Wzorzec typu jest stosowany do wyrażenia wejściowego. Język C# oblicza wyrażenie, po czym sprawdza, czy otrzymana wartość nie ma wartości null i czy jej typ w czasie wykonywania jest zgodny z określonym typem. Wzorzec typu zgłasza tylko, czy test typu zakończy się powodzeniem. Nie deklaruje zmiennej.
Zadaj pytanie, na które można odpowiedzieć „tak” lub „nie”
W systemie dostarczania IRouteStop jest kontraktem możliwości dla lokalizacji docelowych akceptowanych przez mechanizm planowania tras.
CanRoute sprawdza, czy oceniany cel obsługuje tę funkcję, a wynik logiczny określa, czy cel zostaje uwzględniony w procesie planowania trasy. Ten przepływ pracy wymaga jedynie odpowiedzi „tak” lub „nie” i nie odczytuje żadnych składowych route-stop, więc sprawdza się wzorzec typu bez przechwytywanej zmiennej.
static bool CanRoute(object? destination) =>
destination is IRouteStop;
Wyrażenie wejściowe to destination, i IRouteStop jest typem testowanym. Wybierz wzorzec typu, gdy odpowiedź brzmi tylko tak lub nie. Jeśli dopasowana gałąź musi odczytać adres lub wywołać innego składowego za pomocą IRouteStop, zamiast tego wybierz wzorzec deklaracji, aby gałąź miała zmienną tego typu.
Note
Może również zostać wyświetlony komunikat destination is IRouteStop _. Ta składnia jest wzorcem deklaracji, w którym _ oznacza, że żadna zmienna nie jest zachowywana. Wykonuje ten sam rodzaj testu, gdy obie formy są poprawne, ale destination is IRouteStop wyraźniej wskazuje zamiar użycia wyłącznie do testów.
Dopasowywanie klas i interfejsów
W systemie dostaw element IRouteStop definiuje kontrakt funkcjonalności dla miejsc docelowych w planowaniu tras, natomiast RouteStop jest klasą bazową, która udostępnia wspólne dane oraz implementację dla przystanków na trasie.
ExpressRouteStop jest wyspecjalizowaną klasą pochodzącą z RouteStopklasy . Przykład testuje jedną obliczoną wartość, aby jej dane wyjściowe mogły zademonstrować wszystkie trzy zgodne typy. Każdy test wymaga tylko wyniku logicznego, więc nie jest wymagana przechwycona zmienna.
interface IRouteStop { }
abstract class RouteStop(string street) : IRouteStop
{
public string Street { get; } = street;
public string GetDisplayName() => Street;
}
sealed class ExpressRouteStop(string street) : RouteStop(street)
{
}
static void ShowCompatibility()
{
object destination = new ExpressRouteStop("8 Oak Avenue");
Console.WriteLine($"Exact class: {destination is ExpressRouteStop}");
Console.WriteLine($"Base class: {destination is RouteStop}");
Console.WriteLine($"Interface: {destination is IRouteStop}");
}
Obliczona wartość to ExpressRouteStop. Wynik pokazuje, że odpowiada dokładnie swojej klasie, swojej klasie bazowej RouteStop oraz interfejsowi IRouteStop, implementowanemu przez RouteStop.
Szczegółowe reguły zgodności i przypadki krawędzi można znaleźć w dokumentacji dotyczącej wzorca typów.
Trasuj kilka typów
W systemie wsparcia SupportRequest jest klasą bazową dla wyspecjalizowanych klas żądań, takich jak PasswordResetRequest i BillingQuestion.
Ramię przełącznika paruje wzorzec z wynikiem, który ma być zwracany, gdy ten wzorzec jest zgodny. Każde ramię zwraca nazwę kolejki przetwarzania, a końcowe ramię zapewnia kolejkę rezerwową dla innych ocenianych wartości. Wybrana kolejka zależy tylko od typu czasu wykonywania obliczonej wartości, więc wzorce typów pasują, ponieważ żaden element członkowski żądania nie jest odczytywany.
static string RouteRequest(object request) =>
request switch
{
PasswordResetRequest => "Identity queue",
BillingQuestion => "Billing queue",
SupportRequest => "General support queue",
_ => "Intake queue"
};
Każde ramię odpowiada na pytanie o typ i zwraca kolejkę obsługującą dane żądanie. Jeśli gałąź musi odczytać składowe żądania, użyj wzorca deklaracji, aby przypisać pasującą wartość do zmiennej.
Ramiona przełącznika są brane pod uwagę od góry do dołu. Umieść wyspecjalizowaną klasę przed klasą bazową. W przeciwnym razie ramię klasy bazowej może dopasować się do każdej instancji klasy specjalizowanej, co sprawia, że późniejsze ramię nigdy nie zostanie osiągnięte.
Opcjonalnie: użyj parametru typu jako testowanego typu
Ten opcjonalny przykład opiera się na typach ogólnych i metodach.
Parametr typu, taki jak TRequest jest symbolem zastępczym typu, który dostarcza obiekt wywołujący. Partia żądań przychodzących może zawierać kilka typów żądań, a wywołujący dostarcza ConfidentialRequest, aby sprawdzić, czy jakiekolwiek żądanie wymaga poufnej obsługi. Wynik logiczny wybiera poufne obsługę całej partii i generuje widoczny komunikat o stanie. Wzorzec typu z parametrem typu pasuje, ponieważ ma znaczenie tylko istnienie zgodnego żądania, więc pasujący obiekt nie musi być zachowywany.
static void ShowConfidentialBatchHandling()
{
object[] incomingRequests = [new BillingQuestion(), new ConfidentialRequest()];
bool requiresConfidentialHandling =
ContainsRequestOfType<ConfidentialRequest>(incomingRequests);
Console.WriteLine(requiresConfidentialHandling
? "Send the entire batch to confidential handling."
: "Send the batch to standard handling.");
}
static bool ContainsRequestOfType<TRequest>(IEnumerable<object> requests)
{
foreach (object request in requests)
{
if (request is TRequest)
{
return true;
}
}
return false;
}
Jeśli obiekt wywołujący potrzebuje samego zgodnego żądania, operacja wyszukiwania lub filtrowania zwracająca pasujące elementy byłaby bardziej odpowiednia.