Delegate Clase

Definición

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 Delegate clase es la clase base para los tipos delegados. Sin embargo, solo el sistema y los compiladores pueden derivar explícitamente de la Delegate clase o de la MulticastDelegate clase . Tampoco se permite derivar un nuevo tipo de un tipo delegado. La Delegate clase no se considera un tipo delegado; es una clase que se usa para derivar tipos delegados.

La mayoría de los lenguajes implementan una delegate palabra clave y los compiladores para esos lenguajes pueden derivar de la MulticastDelegate clase; por lo tanto, los usuarios deben usar la delegate palabra clave proporcionada por el lenguaje.

Nota

Common Language Runtime proporciona un Invoke método para cada tipo de delegado, con la misma firma que el delegado. No es necesario llamar a este método explícitamente desde C#, Visual Basic o Visual C++, porque los compiladores lo llaman automáticamente. El Invoke método es útil en la reflexión cuando desea encontrar la firma del tipo delegado.

Common Language Runtime proporciona cada tipo de delegado con BeginInvoke métodos 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:

  • Método de instancia de un tipo y un objeto de destino asignable a ese tipo.

  • Método de instancia de un tipo, con el parámetro oculto this 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 CreateDelegate(Type, Object, MethodInfo, Boolean) método.

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 oculto this en su lista de parámetros formal; 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 que se puede asignar 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 invocaciones. 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 invocaciones. 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 Combine métodos 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 delegados genéricos pueden tener parámetros de tipo variant. Los parámetros de tipo contravariante se pueden usar como tipos de parámetros del delegado y se puede usar un parámetro de tipo covariante como tipo de valor devuelto. Esta característica permite que los tipos delegados 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 Covarianza y Contravariance.

Nota

Los delegados genéricos que son 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 todos los métodos de la lista de invocación que se ejecutan secuencialmente y actualizan 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 de tipos.

Para obtener ejemplos, consulte Comentarios complementarios de api para System.Delegate.CreateDelegate.

Constructores

Delegate(Object, String)

Inicializa un delegado que invoca al método de instancia especificado en la instancia de clase especificada.

Delegate(Type, String)

Inicializa un delegado que invoca al método estático especificado a partir de la clase especificada.

Propiedades

HasSingleTarget

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.

Method

Obtiene el método representado por el delegado.

Target

Obtiene la instancia de clase donde el delegado actual invoca al método de instancia.

Métodos

Clone()

Crea una copia superficial del delegado.

Combine(Delegate, Delegate)

Concatena las listas de invocaciones de dos delegados.

Combine(Delegate[])

Concatena las listas de invocaciones de una matriz de delegados.

CombineImpl(Delegate)

Concatena las listas de invocaciones del delegado de multidifusión (combinable) especificado y del delegado de multidifusión (combinable) actual.

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 establecido para el caso de que se produzca un error al enlazar.

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 definido.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Crea un delegado del tipo especificado que representa el método estático o de instancia determinado, con el primer argumento definido y el comportamiento especificado si se produce un error en el 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 que se haya especificado.

CreateDelegate(Type, Object, String, Boolean, Boolean)

Crea un delegado del tipo especificado que representa el método de instancia determinado que se va a invocar en la instancia de clase especificada, con la distinción de mayúsculas y minúsculas y el comportamiento que se hayan concretado para cuando se produce un error al enlazar.

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 determinado de la clase especificada, con la distinción de mayúsculas y minúsculas definida.

CreateDelegate(Type, Type, String, Boolean, Boolean)

Crea un delegado del tipo especificado que representa el método estático determinado de la clase especificada, con la distinción de mayúsculas y minúsculas definida y el comportamiento que se haya concretado para cuando se produce un error al enlazar.

DynamicInvoke(Object[])

Invoca dinámicamente (en tiempo de ejecución) al método representado por el delegado actual.

DynamicInvokeImpl(Object[])

Invoca dinámicamente (en tiempo de ejecución) al método representado por el delegado actual.

EnumerateInvocationList<TDelegate>(TDelegate)

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.

Equals(Object)

Determina si el objeto especificado y el delegado actual son del mismo tipo y comparten los mismos destinos, métodos y listas de invocaciones.

GetHashCode()

Devuelve un código hash para el delegado.

GetInvocationList()

Devuelve la lista de invocaciones del delegado.

GetMethodImpl()

Obtiene el método representado por el delegado actual.

GetObjectData(SerializationInfo, StreamingContext)
Obsoletos.

No compatible.

GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
Remove(Delegate, Delegate)

Quita la última aparición de la lista de invocaciones de un delegado de la lista de invocaciones de otro delegado.

RemoveAll(Delegate, Delegate)

Quita todas las apariciones de la lista de invocaciones de un delegado de la lista de invocaciones de otro delegado.

RemoveImpl(Delegate)

Quita la lista de invocaciones de un delegado de la lista de invocaciones 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.

Se aplica a

Consulte también