Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Tip
Dit artikel maakt deel uit van de sectie Grondbeginselen voor ontwikkelaars die al ten minste één programmeertaal kennen en C# leren. Begin met het overzicht van patroonkoppeling als patronen nieuw voor u zijn. Zie declaratie- en typepatronen in de taalreferentie voor volledige compatibiliteitsregels.
Een typepatroon wordt toegepast op een invoerexpressie. C# evalueert de expressie en test vervolgens of de resulterende waarde niet null is en het runtimetype compatibel is met het opgegeven type. Een typepatroon rapporteert alleen of de typetest slaagt. Er wordt geen variabele gedeclareerd.
Stel een ja-or-no vraag
In een afleversysteem is IRouteStop een capaciteitscontract voor bestemmingen die door routeplanning worden geaccepteerd.
CanRoute test of de geëvalueerde bestemming die mogelijkheid heeft en het Booleaanse resultaat bepaalt of de bestemming de werkstroom voor routeplanning invoert. De workflow heeft alleen een ja-of-nee-antwoord nodig en leest geen route-stop-members, dus een typepatroon zonder gebonden variabele volstaat.
static bool CanRoute(object? destination) =>
destination is IRouteStop;
De invoerexpressie is destinationen IRouteStop is het type dat wordt getest. Kies een typepatroon wanneer het antwoord alleen ja of nee is. Als de overeenkomende tak een adres moet ophalen of via IRouteStop een ander lid moet aanroepen, kies dan in plaats daarvan een declaratiepatroon, zodat die tak een variabele van dat type heeft.
Note
Mogelijk ziet u ook destination is IRouteStop _. Deze syntaxis is een declaratiepatroon, wat _ betekent dat er geen variabele wordt bewaard. Het voert dezelfde typecontrole uit wanneer beide vormen geldig zijn, maar destination is IRouteStop maakt de intentie om alleen te testen directer duidelijk.
Klassen en interfaces vergelijken
In het leveringssysteem definieert IRouteStop het mogelijkhedencontract voor bestemmingen voor routeplanning, terwijl RouteStop een basisklasse is die gemeenschappelijke gegevens en implementatie voor routestops biedt.
ExpressRouteStop is een gespecialiseerde klasse afgeleid van RouteStop. In het voorbeeld wordt één geëvalueerde waarde getest, zodat de uitvoer alle drie de compatibele typen kan demonstreren. Voor elke test is slechts een Booleaans resultaat nodig, dus er is geen vastgelegde variabele nodig.
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}");
}
De geëvalueerde waarde is een ExpressRouteStop. In de uitvoer ziet u dat dit overeenkomt met de exacte klasse, de RouteStop-basisklasse en de IRouteStop-interface die door RouteStop wordt geïmplementeerd.
Zie de verwijzing naar het typepatroon voor gedetailleerde compatibiliteitsregels en edge-gevallen.
Verschillende typen routeren
Is in een ondersteuningssysteem SupportRequest de basisklasse voor gespecialiseerde aanvraagklassen zoals PasswordResetRequest en BillingQuestion. Een switch arm combineert een patroon met het resultaat dat wordt geretourneerd wanneer dat patroon overeenkomt. Elke arm retourneert de naam van een verwerkingswachtrij en de laatste arm biedt een terugvalwachtrij voor andere geëvalueerde waarden. De geselecteerde wachtrij is alleen afhankelijk van het runtime-type van de geëvalueerde waarde, dus typepatronen zijn geschikt omdat geen enkel lid van de aanvraag wordt geraadpleegd.
static string RouteRequest(object request) =>
request switch
{
PasswordResetRequest => "Identity queue",
BillingQuestion => "Billing queue",
SupportRequest => "General support queue",
_ => "Intake queue"
};
Elke arm beantwoordt een typevraag en retourneert de wachtrij die die aanvraag verwerkt. Als een arm aanvraagleden moet lezen, gebruikt u een declaratiepatroon om de overeenkomende waarde in een variabele vast te leggen.
Schakelarmen worden beschouwd van boven naar beneden. Plaats een gespecialiseerde klasse vóór de basisklasse. Anders kan de arm van de basisklasse overeenkomen met elke instantie van de gespecialiseerde klasse, waardoor de daaropvolgende arm onbereikbaar wordt.
Optioneel: gebruik een typeparameter als het geteste type
Dit optionele voorbeeld is gebaseerd op algemene typen en methoden. Een typeparameter, zoals TRequest, is een plaatsaanduiding voor een type dat de aanroeper opgeeft. Een batch voor binnenkomende aanvragen kan verschillende aanvraagtypen bevatten en de beller levert ConfidentialRequest om te testen of een aanvraag vertrouwelijke verwerking vereist. Het Booleaanse resultaat selecteert vertrouwelijke verwerking voor de hele batch en produceert een zichtbaar statusbericht. Een typepatroon met een typeparameter past omdat alleen het bestaan van een overeenkomende aanvraag belangrijk is, zodat het overeenkomende object niet hoeft te worden bewaard.
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;
}
Als de beller de overeenkomende aanvraag zelf nodig had, zou een zoek- of filterbewerking die overeenkomende items retourneert beter geschikt zijn.