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.
En el artículo anterior, vio cómo crear tipos de delegado específicos mediante el uso de la palabra clave delegate
.
La clase abstracta Delegate proporciona la infraestructura para el acoplamiento flexible y la invocación. Los tipos delegados concretos se vuelven mucho más útiles al adoptar y aplicar la seguridad de tipos para los métodos que se agregan a la lista de invocación de un objeto delegado. Cuando se usa la delegate
palabra clave y se define un tipo de delegado concreto, el compilador genera esos métodos.
En la práctica, esto provocaría la creación de nuevos tipos de delegado siempre que necesite una firma de método diferente. Este trabajo podría resultar tedioso después de un tiempo. Cada nueva característica requiere nuevos tipos de delegado.
Afortunadamente, esto no es necesario. .NET Core Framework contiene varios tipos que puede reutilizar siempre que necesite tipos delegados. Se trata de definiciones genéricas para que pueda declarar personalizaciones cuando necesite nuevas declaraciones de método.
El primero de estos tipos es el Action tipo y varias variaciones:
public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.
El in
modificador del argumento de tipo genérico se trata en el artículo sobre covarianza.
Hay variaciones del Action
delegado que contienen hasta 16 argumentos como Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>.
Es importante que estas definiciones usen distintos argumentos genéricos para cada uno de los argumentos delegados: esto proporciona máxima flexibilidad. No es necesario que los argumentos del método sean, pero pueden ser del mismo tipo.
Use uno de los tipos Action
para cualquier tipo de delegado que tenga un tipo de valor devuelto void.
El marco también incluye varios tipos de delegados genéricos que se pueden usar para tipos delegados que devuelven valores:
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity
El out
modificador del argumento de tipo genérico de resultado se trata en el artículo sobre covarianza.
Hay variaciones del Func
delegado con hasta 16 argumentos de entrada, como Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>.
El tipo del resultado es siempre el último parámetro de tipo en todas las Func
declaraciones, por convención.
Use uno de los Func
tipos para cualquier tipo de delegado que devuelva un valor.
También hay un tipo Predicate<T> especializado para un delegado que devuelva una prueba en un valor único:
public delegate bool Predicate<in T>(T obj);
Puede observar que para cualquier Predicate
tipo existe un tipo estructuralmente equivalente Func
; por ejemplo:
Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;
Podría pensar que estos dos tipos son equivalentes. No lo son. Estas dos variables no se pueden usar indistintamente. No se puede asignar una variable de un tipo al otro tipo. El sistema de tipos de C# usa los nombres de los tipos definidos, no la estructura.
Todas estas definiciones de tipo delegado de la biblioteca de .NET Core deben significar que no es necesario definir un nuevo tipo de delegado para ninguna característica nueva que cree que requiera delegados. Estas definiciones genéricas deben proporcionar todos los tipos de delegado que necesita en la mayoría de las situaciones. Simplemente puede crear una instancia de uno de estos tipos con los parámetros de tipo necesarios. En el caso de algoritmos que pueden hacerse genéricos, estos delegados se pueden utilizar como tipos genéricos.
Esto debe ahorrar tiempo y minimizar el número de tipos nuevos que necesita crear para poder trabajar con delegados.
En el siguiente artículo, verá varios patrones comunes para trabajar con delegados en la práctica.