Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Tip
Este artículo forma parte de la sección Aspectos básicos de los desarrolladores que ya conocen al menos un lenguaje de programación y están aprendiendo C#. Comience con la descripción general de la coincidencia de patrones si no está familiarizado con los patrones. Para consultar todas las reglas de compatibilidad, consulte los patrones de declaración y de tipo en la referencia del lenguaje.
Se aplica un patrón de tipo a una expresión de entrada. C# evalúa la expresión y, a continuación, comprueba si el valor resultante no es NULL y su tipo de tiempo de ejecución es compatible con el tipo especificado. Un patrón de tipo informa solo si la prueba de tipo se realiza correctamente. No declara una variable.
Formular una pregunta de tipo sí-or-no
En un sistema de distribución, IRouteStop es un contrato de capacidad para destinos aceptados por la planificación de rutas.
CanRoute comprueba si el destino evaluado tiene esa funcionalidad y su resultado booleano determina si el destino entra en el flujo de trabajo de planeación de rutas. El flujo de trabajo solo necesita una respuesta de sí o no y no lee ningún miembro route-stop, por lo que encaja un patrón de tipo sin variable capturada.
static bool CanRoute(object? destination) =>
destination is IRouteStop;
La expresión de entrada es destinationy IRouteStop es el tipo que se está probando. Elija un patrón de tipo cuando la respuesta sea solo sí o no. Si la rama correspondiente necesita leer una dirección o llamar a otro miembro a través de IRouteStop, elija en su lugar un patrón de declaración para que esa rama disponga de una variable de ese tipo.
Nota:
También puede ver destination is IRouteStop _. Esa sintaxis es un patrón de declaración en el que _ significa que no se conserva ninguna variable. Realiza la misma comprobación de tipo cuando ambas formas son válidas, pero destination is IRouteStop expresa más claramente que la intención es únicamente realizar la comprobación.
Hacer coincidir clases e interfaces
En el sistema de distribución, IRouteStop define el contrato de capacidades para los destinos de planificación de rutas, mientras que RouteStop es una clase base que proporciona los datos y la implementación comunes de las paradas de ruta.
ExpressRouteStop es una clase especializada derivada de RouteStop. En el ejemplo se prueba un valor evaluado para que su salida pueda demostrar los tres tipos compatibles. Cada prueba solo necesita un resultado booleano, por lo que no se necesita ninguna variable capturada.
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}");
}
El valor evaluado es un ExpressRouteStop. La salida muestra que coincide con su clase exacta, su RouteStop clase base y la IRouteStop interfaz que RouteStop implementa.
Para obtener reglas de compatibilidad detalladas y casos perimetrales, consulte la referencia del patrón de tipo.
Enrutar varios tipos
En un sistema de soporte técnico, SupportRequest es la clase base para clases de solicitud especializadas, como PasswordResetRequest y BillingQuestion. Una rama de switch asocia un patrón con el resultado que se devuelve cuando ese patrón coincide. Cada brazo devuelve el nombre de una cola de procesamiento y el brazo final proporciona una cola de reserva para otros valores evaluados. La cola seleccionada depende solo del tipo en tiempo de ejecución del valor evaluado, por lo que los patrones de tipo encajan, ya que no se lee ningún miembro de la solicitud.
static string RouteRequest(object request) =>
request switch
{
PasswordResetRequest => "Identity queue",
BillingQuestion => "Billing queue",
SupportRequest => "General support queue",
_ => "Intake queue"
};
Cada rama responde a una pregunta sobre el tipo y devuelve la cola que gestiona esa solicitud. Si una rama necesita leer los miembros de la solicitud, use un patrón de declaración para capturar el valor correspondiente en una variable.
Los brazos del conmutador se consideran de arriba a abajo. Coloque una clase especializada antes de su clase base. De lo contrario, el brazo de clase base puede coincidir con cada instancia de la clase especializada, lo que hace que el brazo posterior sea inaccesible.
Opcional: use un parámetro de tipo como tipo probado.
Este ejemplo opcional se basa en tipos y métodos genéricos. Un parámetro de tipo como TRequest es un marcador de posición para un tipo que proporciona el autor de la llamada. Un lote de solicitud entrante puede contener varios tipos de solicitud y el autor de la llamada proporciona ConfidentialRequest para probar si alguna solicitud requiere un control confidencial. El resultado booleano selecciona el control confidencial de todo el lote y genera un mensaje de estado visible. Un patrón de tipo con un parámetro de tipo se ajusta porque solo importa la existencia de una solicitud coincidente, por lo que no es necesario conservar el objeto coincidente.
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;
}
Si el autor de la llamada necesitaba la propia solicitud coincidente, sería más adecuada una operación de búsqueda o filtro que devuelva elementos coincidentes.