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 relationele patronen en logische patronen in de taalreferentie voor volledige taalregels.
Relationele en logische patronen beschrijven waardenbereiken, alternatieven en uitsluitingen. Met de volgende methode worden ze gecombineerd om een temperatuur te classificeren:
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"
};
De expressie temperature is de patrooninvoer. C# evalueert deze eenmaal en elke schakelarm test de resulterende waarde. De armen demonstreren deze tests:
-
< 0test één grenswaarde. -
>= 18 and <= 24test een bereik. -
(>= 0 and < 10) or > 30test twee alternatieve intervallen.
Dit artikel bevat zowel patronen als imperatieve voorwaarden, zodat u elk formulier kunt leren en kunt vergelijken hoe ze dezelfde beslissingen uitdrukken. Eén voorwaarde kan er in beide vormen ongeveer als volgt uitzien. Patronen kunnen een reeks gerelateerde vertakkingen gemakkelijker leesbaar maken door de keuzes naast hun resultaten te houden. Kies het formulier waarmee de code het gemakkelijkst te begrijpen is.
Waarden vergelijken met relationele patronen
Een relationeel patroon vergelijkt de patrooninvoer met een compilatieconstante met behulp van <, >, <=of >=. Een compilatieconstante is een waarde die de compiler kan evalueren tijdens het compileren van het programma. Letterlijke cijfers en tekens const en variabelen van compatibele numerieke of tekentypen zijn representatieve voorbeelden. Gewone variabelen, eigenschappen, methode-aanroepen en static readonly velden zijn geen compileertijdconstanten. In het openingsvoorbeeld testen zowel <= 24 als >= 18 dezelfde geëvalueerde temperature-waarde.
Hetzelfde relationele symbool kan worden weergegeven in een gewone expressie of in een patroon. In het volgende voorbeeld worden beide vormen met een temperatuur gebruikt:
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 is een relationele expressie. Het evalueert beide operanden en produceert een bool. Beide operanden kunnen een niet-constante expressie zijn.
In temperature is < 0, temperature is de patrooninvoerexpressie. C# evalueert het en het relationele patroon < 0 test de resulterende waarde. In de switch-arm < 0 => "Freezing" levert de expressie vóór switch de invoer, dus bevat het patroon alleen < 0.
De expressie kan worden vergeleken temperature met de variabele threshold. Een operand met een relationeel patroon moet een compilatieconstante zijn, dus gebruik de relationele expressie wanneer de vergelijkingswaarde een variabele is. Wanneer de vergelijkingswaarde constant is, kan een van beide vormen werken.
Wanneer de juiste operand constant is, kiest u voornamelijk voor leesbaarheid. Een relationele expressie past vaak bij één directe vergelijking. Een relationeel patroon kan met andere patronen worden gecombineerd en past er natuurlijk bij wanneer meerdere waardenbereiken aan switch-resultaten worden gekoppeld.
Voorwaarden combineren met logische patronen
Logische patronen combineren of negëren patronen met de patroonoperatoren and, or en not:
- Een
andpatroon komt overeen wanneer beide geneste patronen overeenkomen. - Een
or-patroon komt overeen als een van beide geneste patronen overeenkomt. - Een
notpatroon slaagt wanneer het geneste patroon mislukt.
In het openingsvoorbeeld wordt and een bereik beschreven en or alternatieven beschreven. Een not patroon kan een waarde uitsluiten, zoals in status is not Status.Complete. De volgende methoden geven beide formulieren weer, zodat u hun syntaxis kunt leren kennen en kunt vergelijken hoe ze dezelfde test uitdrukken:
static bool IsWeekendPattern(DayOfWeek day) =>
day is DayOfWeek.Saturday or DayOfWeek.Sunday;
static bool IsWeekendImperative(DayOfWeek day) =>
day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;
Het patroonformulier maakt gebruik van twee constante patronen die worden samengevoegd door or. De imperatieve vorm maakt gebruik van twee gelijkheidsexpressies die zijn gekoppeld door de operator ||conditional-OR. Beide formulieren zijn beknopt en duidelijk voor deze enkele voorwaarde. Kies het formulier dat het beste past bij de omringende code. Patronen verduidelijken vaak verschillende gerelateerde keuzes in een switch, zoals in het openingsvoorbeeld.
Patroonoperators vormen patronen in plaats van Boole-expressies: and komt overeen met patroonverbindingen, or patroonalternatieven en not patroonondertekening. Booleaanse expressies gebruiken &&, ||en !. Kies or wanneer verschillende patroonalternatieven hetzelfde resultaat hebben. Kies not wanneer het duidelijker is om het uitgesloten patroon te beschrijven dan alle geaccepteerde waarden op te sommen.
Patronen groeperen met haakjes
Een patroon tussen haakjes gebruikt haakjes om aan te geven of te wijzigen hoe geneste patronen worden gegroepeerd. Binding bepaalt welke patroonoperanden een operator groepeert, vergelijkbaar met impliciete groepering wanneer u geen haakjes schrijft. C# geeft de volgende bindingsvolgorde op:
notandor
De volgende test accepteert prioriteiten 1 tot en met 3 of de speciale prioriteit 9:
static bool IsAcceptedPriority(int priority) =>
priority is (>= 1 and <= 3) or 9;
De compilergroepen and vóór or. De haakjes maken de beoogde groepering expliciet en de twee alternatieven gemakkelijk te zien: het bereik van 1 tot en met 3 of 9. Voor leesbaarheid gebruikt u haakjes wanneer een patroon zich mengt and en or, of wanneer not dit van toepassing is op een samengesteld patroon. Haakjes kunnen ook de standaardgroepering wijzigen, zoals in not (>= 1 and <= 3).
De volgorde van runtimecontroles voor geneste patronen is niet gespecificeerd, en patroonoperators volgen de regels voor patroonovereenkomst in plaats van Booleaanse kortsluitregels. Schrijf geneste patronen zodat hun resultaat onafhankelijk is van de volgorde van de controles.
when Een bewaker gebruiken voor een afzonderlijke voorwaarde
Logische patronen werken het beste wanneer geneste patronen de invoerwaarde zelf beschrijven. Een when-voorwaarde is een aanvullende Booleaanse voorwaarde bij een case-label of switch-onderdeel. Gebruik een bewaker wanneer de beslissing ook afhankelijk is van informatie die losstaat van de invoer van het patroon.
De volgende waarschuwing is afhankelijk van de temperatuur en een afzonderlijke isOutdoors waarde:
static string GetHeatWarning(int temperature, bool isOutdoors) =>
temperature switch
{
> 35 when isOutdoors => "High heat outdoors",
> 35 => "High heat",
_ => "No heat warning"
};
Het relationele patroon > 35 beschrijft de temperature invoer. De bewaker when isOutdoors controleert een afzonderlijke waarde. Een bewaker heeft ook de voorkeur wanneer de voorwaarde een methodeaanroep of een Booleaanse expressie nodig heeft die de syntaxis van het patroon niet duidelijk uitdrukt.
Gebruik relationele en logische patronen wanneer ze de toegestane vormen of waarden van de invoer gemakkelijker te zien maken, met name over verschillende schakelarmen. Gebruik een gewone Boole-expressie wanneer deze een directe voorwaarde simpeler aangeeft. Gebruik een when bewaker wanneer een switchkeuze afhankelijk is van een afzonderlijke waarde of een voorwaarde die beter wordt uitgedrukt als een Boole-expressie.