Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tip
Tento článek je součástí části Základy pro vývojáře, kteří už znají aspoň jeden programovací jazyk a učí se jazyk C#. Začněte přehledem porovnávání vzorů , pokud jsou pro vás vzory nové. Úplná pravidla kompatibility najdete v referenční příručce k jazyku v části vzory deklarací a typů.
U vstupního výrazu se použije vzor typu . Jazyk C# vyhodnotí výraz a pak otestuje, jestli je výsledná hodnota nenulová a její typ běhu je kompatibilní se zadaným typem. Vzor typu hlásí pouze to, jestli test typu proběhne úspěšně. Nedeklaruje proměnnou.
Položte otázku typu ano/ne
V systému doručování je IRouteStop smlouva o schopnostech pro destinace akceptované plánováním tras.
CanRoute testuje, jestli má vyhodnocený cíl tuto schopnost a jeho logický výsledek určuje, jestli cíl vstoupí do pracovního postupu plánování trasy. Pracovní tok potřebuje pouze odpověď ano nebo ne a nečte žádné členy route-stop, takže se hodí typový vzor bez zachycené proměnné.
static bool CanRoute(object? destination) =>
destination is IRouteStop;
Vstupní výraz je destinationa IRouteStop je to typ, který se testuje. Vyberte vzor typu, pokud je odpověď pouze ano nebo ne. Pokud příslušná větev potřebuje přečíst adresu nebo volat jiného člena prostřednictvím IRouteStop, zvolte raději vzor deklarace, aby měla proměnnou tohoto typu.
Note
Může se zobrazit také destination is IRouteStop _. Tato syntaxe je vzor deklarace, ve kterém _ není zachována žádná proměnná. Provádí stejný test typu, jsou-li oba zápisy platné, ale destination is IRouteStop přímočařeji vyjadřuje, že jde pouze o test.
Porovnání tříd a rozhraní
V doručovacím systému IRouteStop definuje kontrakt schopností pro cíle plánování tras, zatímco RouteStop je základní třída, která poskytuje společná data zastávek na trase a jejich implementaci.
ExpressRouteStop je specializovaná třída odvozená z RouteStop. Příklad testuje jednu vyhodnocenou hodnotu, aby její výstup mohl demonstrovat všechny tři kompatibilní typy. Každý test potřebuje jenom logický výsledek, takže není potřeba žádná zachycená proměnná.
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}");
}
Vyhodnocená hodnota je hodnota ExpressRouteStop. Výstup ukazuje, že odpovídá své přesné třídě, její RouteStop základní třídě a IRouteStop rozhraní, které RouteStop implementuje.
Podrobná pravidla kompatibility a hraniční případy najdete v referenčních informacích k vzorům typů.
Směrovat několik typů
V systému podpory je SupportRequest základní třídou pro specializované třídy požadavků, jako jsou například PasswordResetRequest a BillingQuestion.
Přepínací rameno spáruje vzor s výsledkem, který se vrátí, když se tento vzor shoduje. Každá větev vrací název fronty zpracování a poslední větev poskytuje záložní frontu pro ostatní vyhodnocené hodnoty. Vybraná fronta závisí pouze na typu běhu vyhodnocené hodnoty, takže vzory typů odpovídají, protože žádný člen požadavku není přečtený.
static string RouteRequest(object request) =>
request switch
{
PasswordResetRequest => "Identity queue",
BillingQuestion => "Billing queue",
SupportRequest => "General support queue",
_ => "Intake queue"
};
Každá větev odpovídá na dotaz na typ a vrací frontu, která daný požadavek zpracovává. Pokud arm potřebuje číst členy požadavku, použijte vzor deklarace k zachycení odpovídající hodnoty v proměnné.
Ramena přepínače se posuzují shora dolů. Specializovanou třídu umístěte před základní třídu. Jinak může větev pro základní třídu odpovídat každé instanci specializované třídy, takže pozdější větev je nedosažitelná.
Volitelné: Jako testovaný typ použijte parametr typu.
Tento volitelný příklad vychází z obecných typů a metod.
Parametr typu, například TRequest zástupný symbol pro typ, který volající dodává. Dávka příchozích požadavků může obsahovat více typů požadavků a volající poskytne ConfidentialRequest, aby otestoval, zda některý požadavek vyžaduje důvěrné zacházení. Logický výsledek vybere důvěrné zpracování celé dávky a vytvoří viditelnou stavovou zprávu. Vzor typu s parametrem typu odpovídá, protože záleží jenom na existenci odpovídajících požadavků, takže odpovídající objekt není potřeba zachovat.
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;
}
Pokud volající potřeboval samotný odpovídající požadavek, byla by vhodnější operace hledání nebo filtru, která vrací odpovídající položky.