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. Als u nieuw bent in programmeren, begint u eerst met de Aan de slag-handleidingen. Ervaren C#-ontwikkelaars kunnen de patronenreferentie gebruiken voor de volledige syntaxis en regels.
Komt u uit een andere taal? C#-patronen vervullen een rol die vergelijkbaar is met Java's patroonvergelijking en Python's match-gevallen. C# maakt gebruik van patronen in is expressies, switch instructies en switch expressies.
Bij patroonkoppeling wordt een patroon toegepast op een expressie. Een patroon is een voorwaarde voor het testen van de invoerexpressie op basis van. De patrooninvoer is die expressie. C# evalueert de invoerexpressie; het resultaat is de geëvalueerde waarde. Het patroon test of die waarde een bepaald type heeft, gelijk is aan een bepaalde waarde of een bepaalde vorm heeft. Wanneer een patroon overeenkomt, kan uw code informatie gebruiken die is geleerd door de test, zoals een specifieker type of een waarde die uit een object is geëxtraheerd.
U kunt een patroon in drie contexten gebruiken:
- Aan de rechterkant van de
is-operator. - In een
caselabel van eenswitchstatement. - In een arm van een
switchexpressie.
Met patronen wordt één geëvalueerde invoerwaarde getest aan de hand van typen, constanten of een structuur die geneste patronen kan bevatten. Een Boole-voorwaarde kan ook twee onafhankelijk geëvalueerde expressies vergelijken waarvan de waarden geen constanten zijn. Wanneer een van beide formulieren dezelfde test kan uitdrukken, kiest u het formulier dat gemakkelijker te lezen is.
De volgende methode gebruikt bijvoorbeeld een switch expressie om een bezorgingsbericht te kiezen:
static string GetDeliveryMessage(Delivery? delivery) =>
delivery switch
{
null => "No delivery was scheduled.",
ExpressDelivery express => $"Express package {express.TrackingCode}",
StandardDelivery { Days: <= 2 } => "Standard delivery arriving soon",
_ => "Standard delivery"
};
Eigenschapspatronen kunnen een externe typetest en geneste patronen bevatten, maar geen van beide is in elk eigenschapspatroon verplicht. In StandardDelivery { Days: <= 2 } ontvangt het buitenste patroon de delivery-expressie en controleert het het type. De Days eigenschapsexpressie wordt vervolgens de invoer voor het geneste relationele patroon <= 2.
De expressie vóór switch is de invoerexpressie. Elke lijn in de accolades is een schakelarm. Het patroon wordt vóór =>weergegeven en het resultaat wordt erna weergegeven. C# evalueert de invoerexpressie en selecteert vervolgens de eerste arm, in tekstuele volgorde, waarvan het patroon overeenkomt en waarvan de optionele when guard true is. De optionele when beveiliging is een extra Booleaanse voorwaarde die na het patroon is geschreven. In het voorgaande voorbeeld ziet u de volgende patronen:
-
nullis een constant patroon. Hiermee wordt getest of de expressiedeliverynaarnullevalueert. -
ExpressDelivery expressis een declaratiepatroon met twee delen.ExpressDeliveryis het onderdeel voor de typetest. Hiermee wordt getest of de geëvalueerde waarde een niet-null-object is waarvan het runtimetype compatibel is metExpressDelivery.expressis de variabeleaanduiding: het declareert een variabele met de naamexpressen wijst het overeenkomendeExpressDeliveryobject eraan toe. -
StandardDelivery { Days: <= 2 }begint met een typetest.StandardDeliverytest of de geëvalueerde waarde een niet-null-object van dat type is. De accolades bevatten een eigenschapspatroon.Daysnoemt de eigenschap die moet worden gecontroleerd, zodat deDayseigenschapsexpressie de invoer wordt voor het recursieve patroon. Het<= 2gedeelte is een relationeel patroon, dat test of de geëvalueerde waarde kleiner is dan of gelijk is aan2. -
_(onderstrepingsteken) is het discard-patroon. Het komt overeen met elke geëvalueerde waarde, inclusiefnull. Omdat eerdere armen alnull, spoedleveringen en standaardleveringen die binnen twee dagen aankomen afhandelen, verwerkt deze laatste arm alle resterende waarden.
Een arm zonder when bewaker is onbewaakt. Alle armen in het eerste voorbeeld zijn onbewaakt. Als een eerdere niet-bewaakte arm overeenkomt met elke geëvalueerde waarde die een latere arm kan overeenkomen, wordt de latere arm onderbroken. Een ondergesomd patroon is een patroon waarbij elke mogelijke invoerwaarde die overeenkomt al is gevonden door een eerdere schakelarm. Het kan nooit overeenkomen, dus de compiler meldt een fout. De verwijderingsarm (_) moet als laatste komen omdat deze overeenkomt met elke invoerexpressie. Een bewaakte arm bevat geen latere arm op basis van het patroon, omdat de bewaker mogelijk is false.
Een schakelexpressie is volledig wanneer de armen elke mogelijke invoerexpressie verwerken. Het eerste voorbeeld is uitputtend, omdat de laatste afwijsarm alles afhandelt waar de eerdere armen niet mee overeenkomen. De compiler waarschuwt wanneer deze een potentiële invoerwaarde detecteert waarvoor geen enkele arm een match heeft. De compiler kan geen volledigheid bewijzen voor elke combinatie van patronen, maar met deze diagnose kunt u de juiste patroonkoppelingscode schrijven. Zie de referentie voor patronen voor gedetailleerde overeenkomsten, subsumptie en uitputtendheidsregels.
Eén voorwaarde testen met is
Gebruik de is operator wanneer u één Booleaanse test nodig hebt. De volgende code evalueert de delivery expressie en past het declaratiepatroon ExpressDelivery expresstoe. Het typegedeelte komt overeen wanneer de geëvalueerde waarde niet null is en het runtimetype compatibel is met ExpressDelivery. Wanneer het patroon overeenkomt, geeft de variabele aanduiding het volgende expressaan:
static void PrintTrackingCode(Delivery delivery)
{
if (delivery is ExpressDelivery express)
{
Console.WriteLine($"Track express package {express.TrackingCode}");
}
}
De compiler houdt bij of er een lokale variabele is toegewezen voordat uw code deze leest. Deze tracering wordt een definitieve toewijzing genoemd. Binnen het blok if kan de voorwaarde alleen true zijn wanneer het patroon het overeenkomende object aan express heeft toegewezen. De compiler weet dus dat daar express zeker aan is toegewezen. Uw code kan de eigenschap veilig gebruiken TrackingCode . U hebt geen aparte cast nodig. Als u alleen de typetest nodig hebt en u geen variabele hoeft te declareren, gebruikt u een typepatroon, zoals delivery is ExpressDelivery.
Gebruik is null of is not null voor null-controles. Deze patronen roepen geen door de gebruiker gedefinieerde ==-operator of !=-operator aan.
static void PrintPackageStatus(Delivery? delivery)
{
if (delivery is null)
{
Console.WriteLine("No package is available.");
}
else
{
Console.WriteLine("A package is ready to track.");
}
}
Zie null-referentietypen voor meer informatie over null-veiligheid.
Kies tussen een statement en een expressie
Patronen werken met beide vormen van switch:
- Gebruik een
switchstatement wanneer voor elke match één of meer statements moeten worden uitgevoerd. - Gebruik een
switch-expressie wanneer elke match een waarde moet opleveren.
De volgende switch-instructie rapporteert een leveringsupdate. De tak voor spoedlevering schrijft twee berichten, dus een statement past daar natuurlijk bij:
static void PrintDeliveryUpdate(Delivery? delivery)
{
switch (delivery)
{
case null:
Console.WriteLine("No delivery was scheduled.");
break;
case ExpressDelivery express:
Console.WriteLine($"Express delivery {express.TrackingCode} is ready.");
Console.WriteLine("Notify the priority desk.");
break;
case StandardDelivery standard:
Console.WriteLine($"Standard delivery arrives in {standard.Days} days.");
break;
default:
Console.WriteLine("Another delivery type is scheduled.");
break;
}
}
Elk case patroon wordt toegepast op de delivery expressie. De overeenkomende sectie kan een willekeurig aantal instructies uitvoeren voordat break het switchstatement verlaat. De default sectie verwerkt alles wat niet overeenkomt met de eerdere gevallen.
Met de volgende switchexpressie wordt een if / else if keten vervangen die één resultaat toewijst:
static string GetStatusMessage(StandardDelivery delivery) =>
delivery.Days switch
{
0 => "Delivered today",
1 => "Arriving tomorrow",
<= 3 => "Arriving soon",
_ => "In transit"
};
Een schakelexpressie is beknopt omdat elke arm hetzelfde doel heeft: de geretourneerde waarde produceren. Gebruik een switch-instructie wanneer vertakkingen acties uitvoeren en gebruik een switchexpressie wanneer vertakkingen één resultaat berekenen.
Patrooncategorieën
C# bevat patronen voor veelvoorkomende soorten gegevenstests:
| Patrooncategorie | Wat wordt getest |
|---|---|
Declaratie, constante en var patronen |
Een runtimetype, een specifieke constante waarde of een waarde die u wilt vastleggen |
| Typepatronen | Een runtimetype zonder een variabele te declareren |
| Eigenschaps- en positionele patronen | Eigenschappen, velden of gedeconstrueerde waarden |
| Relationele, logische en haakjes patronen | Vergelijkingen en combinaties zoals and, oren not |
| Patronen weergeven en segmenteren | De waarden en vorm van een ondersteunde reeks |
| Patronen en verwijderingen verwijderen | Elke resterende waarde of een waarde die uw code opzettelijk negeert |
In de gekoppelde artikelen over grondbeginselen wordt uitgelegd wanneer u elke categorie moet kiezen. Zie de naslaginformatie over patronen voor volledige syntaxis en voorbeelden.