Delegate Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Representa un delegado, que es una estructura de datos que hace referencia a un método estático o a una instancia de clase y un método de instancia de esa clase.
public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
type Delegate = class
interface ICloneable
interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Delegate = class
interface ICloneable
interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Delegate = class
interface ICloneable
interface ISerializable
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
- Herencia
-
Delegate
- Derivado
- Atributos
- Implementaciones
Comentarios
La clase Delegate es la clase base para los tipos delegados. Sin embargo, solo el sistema y los compiladores pueden derivar explícitamente de la clase Delegate o de la clase MulticastDelegate. Tampoco se permite derivar un nuevo tipo de un tipo delegado. La clase Delegate no se considera un tipo de delegado; es una clase que se usa para derivar tipos de delegado.
La mayoría de los lenguajes implementan una palabra clave delegate
y los compiladores para esos lenguajes pueden derivar de la clase MulticastDelegate; por lo tanto, los usuarios deben usar la palabra clave delegate
proporcionada por el idioma.
Nota
Common Language Runtime proporciona un método Invoke
para cada tipo de delegado, con la misma firma que el delegado. No es necesario llamar explícitamente a este método desde C#, Visual Basic o Visual C++, ya que los compiladores lo llaman automáticamente. El método Invoke
es útil en de reflexión cuando desea encontrar la firma del tipo de delegado.
Common Language Runtime proporciona cada tipo de delegado con métodos BeginInvoke
y EndInvoke
, para habilitar la invocación asincrónica del delegado. Para obtener más información sobre estos métodos, vea Llamar a métodos sincrónicos de forma asincrónica.
La declaración de un tipo delegado establece un contrato que especifica la firma de uno o varios métodos. Un delegado es una instancia de un tipo delegado que tiene referencias a:
Un método de instancia de un tipo y un objeto de destino que se puede asignar a ese tipo.
Método de instancia de un tipo, con el parámetro
this
oculto expuesto en la lista de parámetros formales. Se dice que el delegado es un delegado de instancia abierta.Un método estático.
Un método estático y un objeto de destino asignables al primer parámetro del método. Se dice que el delegado se cierra sobre su primer argumento.
Para obtener más información sobre el enlace delegado, consulte la sobrecarga del método CreateDelegate(Type, Object, MethodInfo, Boolean).
Cuando un delegado representa un método de instancia cerrado sobre su primer argumento (el caso más común), el delegado almacena una referencia al punto de entrada del método y una referencia a un objeto, denominado destino, que es de un tipo asignable al tipo que definió el método. Cuando un delegado representa un método de instancia abierta, almacena una referencia al punto de entrada del método. La firma del delegado debe incluir el parámetro this
oculto en su lista de parámetros formales; en este caso, el delegado no tiene una referencia a un objeto de destino y se debe proporcionar un objeto de destino cuando se invoca el delegado.
Cuando un delegado representa un método estático, el delegado almacena una referencia al punto de entrada del método. Cuando un delegado representa un método estático cerrado sobre su primer argumento, el delegado almacena una referencia al punto de entrada del método y una referencia a un objeto de destino asignable al tipo del primer argumento del método. Cuando se invoca el delegado, el primer argumento del método estático recibe el objeto de destino. Este primer argumento debe ser un tipo de referencia.
La lista de invocación de un delegado es un conjunto ordenado de delegados en los que cada elemento de la lista invoca exactamente uno de los métodos representados por el delegado. Una lista de invocación puede contener métodos duplicados. Durante una invocación, los métodos se invocan en el orden en que aparecen en la lista de invocación. Un delegado intenta invocar todos los métodos de su lista de invocación; los duplicados se invocan una vez por cada vez que aparecen en la lista de invocación. Los delegados son inmutables; Una vez creada, la lista de invocación de un delegado no cambia.
Los delegados se conocen como multidifusión o combinables, ya que un delegado puede invocar uno o varios métodos y se puede usar en la combinación de operaciones.
La combinación de operaciones, como Combine y Remove, no modifica los delegados existentes. En su lugar, esta operación devuelve un nuevo delegado que contiene los resultados de la operación, un delegado sin cambios o null
. Una operación de combinación devuelve null
cuando el resultado de la operación es un delegado que no hace referencia al menos a un método. Una operación de combinación devuelve un delegado sin cambios cuando la operación solicitada no tiene ningún efecto.
Nota
Los lenguajes administrados usan los métodos Combine y Remove para implementar operaciones de delegado. Entre los ejemplos se incluyen las instrucciones AddHandler
y RemoveHandler
en Visual Basic y los operadores += y -= en los tipos delegados de C#.
A partir de .NET Framework 4, los tipos de delegado genéricos pueden tener parámetros de tipo variant. Los parámetros de tipo contravariante se pueden usar como tipos de parámetro del delegado y se puede usar un parámetro de tipo covariante como tipo de valor devuelto. Esta característica permite que los tipos de delegado genéricos construidos a partir de la misma definición de tipo genérico sean compatibles con la asignación si sus argumentos de tipo son tipos de referencia con una relación de herencia, como se explica en Covariance y Contravariance.
Nota
Los delegados genéricos compatibles con la asignación debido a la varianza no son necesariamente combinables. Para poder combinarse, los tipos deben coincidir exactamente. Por ejemplo, supongamos que una clase denominada Derived
se deriva de una clase denominada Base
. Un delegado de tipo Action<Base>
(Action(Of Base)
en Visual Basic) se puede asignar a una variable de tipo Action<Derived>
, pero los dos delegados no se pueden combinar porque los tipos no coinciden exactamente.
Si un método invocado produce una excepción, el método deja de ejecutarse, la excepción se devuelve al autor de la llamada del delegado y no se invocan los métodos restantes de la lista de invocación. Detectar la excepción en el autor de la llamada no modifica este comportamiento.
Cuando la firma de los métodos invocados por un delegado incluye un valor devuelto, el delegado devuelve el valor devuelto del último elemento de la lista de invocación. Cuando la firma incluye un parámetro que se pasa por referencia, el valor final del parámetro es el resultado de cada método de la lista de invocación que se ejecuta secuencialmente y actualizando el valor del parámetro.
El equivalente más cercano de un delegado en C es un puntero de función. Un delegado puede representar un método estático o un método de instancia. Cuando el delegado representa un método de instancia, el delegado almacena no solo una referencia al punto de entrada del método, sino también una referencia a la instancia de clase. A diferencia de los punteros de función, los delegados están orientados a objetos y son seguros para tipos.
Para obtener ejemplos, consulte comentarios de API complementarias para System.Delegate.CreateDelegate.
Constructores
Delegate(Object, String) |
Inicializa un delegado que invoca el método de instancia especificado en la instancia de clase especificada. |
Delegate(Type, String) |
Inicializa un delegado que invoca el método estático especificado de la clase especificada. |
Propiedades
HasSingleTarget |
Obtiene un valor que indica si el Delegate tiene un único destino de invocación. |
Method |
Obtiene el método representado por el delegado. |
Target |
Obtiene la instancia de clase en la que el delegado actual invoca el método de instancia. |
Métodos
Clone() |
Crea una copia superficial del delegado. |
Combine(Delegate, Delegate) |
Concatena las listas de invocación de dos delegados. |
Combine(Delegate[]) |
Concatena las listas de invocación de una matriz de delegados. |
Combine(ReadOnlySpan<Delegate>) |
Concatena las listas de invocación de un intervalo de delegados. |
CombineImpl(Delegate) |
Concatena las listas de invocación del delegado de multidifusión (combinable) especificado y el delegado de multidifusión actual (combinable). |
CreateDelegate(Type, MethodInfo) |
Crea un delegado del tipo especificado para representar el método especificado. |
CreateDelegate(Type, MethodInfo, Boolean) |
Crea un delegado del tipo especificado para representar el método estático especificado, con el comportamiento especificado en caso de error de enlace. |
CreateDelegate(Type, Object, MethodInfo) |
Crea un delegado del tipo especificado que representa el método estático o de instancia especificado, con el primer argumento especificado. |
CreateDelegate(Type, Object, MethodInfo, Boolean) |
Crea un delegado del tipo especificado que representa el método estático o de instancia especificado, con el primer argumento especificado y el comportamiento especificado en caso de error de enlace. |
CreateDelegate(Type, Object, String) |
Crea un delegado del tipo especificado que representa el método de instancia especificado que se va a invocar en la instancia de clase especificada. |
CreateDelegate(Type, Object, String, Boolean) |
Crea un delegado del tipo especificado que representa el método de instancia especificado que se va a invocar en la instancia de clase especificada con la distinción de mayúsculas y minúsculas especificada. |
CreateDelegate(Type, Object, String, Boolean, Boolean) |
Crea un delegado del tipo especificado que representa el método de instancia especificado que se va a invocar en la instancia de clase especificada, con la distinción entre mayúsculas y minúsculas especificada y el comportamiento especificado en caso de error de enlace. |
CreateDelegate(Type, Type, String) |
Crea un delegado del tipo especificado que representa el método estático especificado de la clase especificada. |
CreateDelegate(Type, Type, String, Boolean) |
Crea un delegado del tipo especificado que representa el método estático especificado de la clase especificada, con la distinción entre mayúsculas y minúsculas especificada. |
CreateDelegate(Type, Type, String, Boolean, Boolean) |
Crea un delegado del tipo especificado que representa el método estático especificado de la clase especificada, con la distinción de mayúsculas y minúsculas especificada y el comportamiento especificado en caso de error de enlace. |
DynamicInvoke(Object[]) |
Invoca dinámicamente (enlazado en tiempo de ejecución) el método representado por el delegado actual. |
DynamicInvokeImpl(Object[]) |
Invoca dinámicamente (enlazado en tiempo de ejecución) el método representado por el delegado actual. |
EnumerateInvocationList<TDelegate>(TDelegate) |
Obtiene un enumerador para los destinos de invocación de este delegado. |
Equals(Object) |
Determina si el objeto especificado y el delegado actual son del mismo tipo y comparten los mismos destinos, métodos e lista de invocación. |
GetHashCode() |
Devuelve un código hash para el delegado. |
GetInvocationList() |
Devuelve la lista de invocación del delegado. |
GetMethodImpl() |
Obtiene el método representado por el delegado actual. |
GetObjectData(SerializationInfo, StreamingContext) |
Obsoletos.
No se admite. |
GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
MemberwiseClone() |
Crea una copia superficial del Objectactual. (Heredado de Object) |
Remove(Delegate, Delegate) |
Quita la última aparición de la lista de invocación de un delegado de la lista de invocación de otro delegado. |
RemoveAll(Delegate, Delegate) |
Quita todas las apariciones de la lista de invocación de un delegado de la lista de invocación de otro delegado. |
RemoveImpl(Delegate) |
Quita la lista de invocación de un delegado de la lista de invocación de otro delegado. |
ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |
Operadores
Equality(Delegate, Delegate) |
Determina si los delegados especificados son iguales. |
Inequality(Delegate, Delegate) |
Determina si los delegados especificados no son iguales. |
Métodos de extensión
GetMethodInfo(Delegate) |
Obtiene un objeto que representa el método representado por el delegado especificado. |