Delegate (Instrucción)

Se usa para declarar un delegado. Un delegado es un tipo de referencia que hace mención a un método Shared de un tipo o a un método de instancia de un objeto. Cualquier procedimiento con parámetros coincidentes y tipos devueltos puede usarse para crear una instancia de esta clase de delegado. Después, el procedimiento se puede invocar posteriormente mediante la instancia de delegado.

Sintaxis

[ <attrlist> ] [ accessmodifier ] _  
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]  

Partes

Término Definición
attrlist Opcional. Lista de atributos que se aplican a este delegado. Los diversos atributos se separan con comas. Debe incluir la lista de atributos entre corchetes angulares ("<" y ">").
accessmodifier Opcional. Especifica qué código puede acceder al delegado. Puede ser uno de los siguientes:

- Public. Cualquier código con acceso al elemento que declara el delegado puede acceder a él.
- Protected. Solo el código de la clase del delegado o de una clase derivada puede acceder a él.
- Friend. Solo el código del mismo ensamblado puede acceder al delegado.
- Private. Solo el código del elemento que declara el delegado puede acceder a él.

- Protected Friend. Solo el código de la clase del delegado, una clase derivada o el mismo ensamblado puede acceder a él.
- Private Protected. Solo el código de la clase del delegado o en una clase derivada del mismo ensamblado puede acceder a él.
Shadows Opcional. Indica que este delegado vuelve a declarar y oculta un elemento de programación con el mismo nombre, o un conjunto de elementos sobrecargados, en una clase base. Puede reemplazar cualquier tipo de elemento declarado con cualquier otro tipo.

Un elemento reemplazado no está disponible desde la clase derivada que lo reemplaza, excepto desde donde el elemento reemplazado es inaccesible. Por ejemplo, si un elemento Private reemplaza un elemento de clase base, el código que no tiene permiso para acceder al elemento Private accede en su lugar al elemento de clase base.
Sub Opcional, pero deben aparecer Sub o Function. Declara esto como un procedimiento Sub delegado que no devuelve un valor.
Function Opcional, pero deben aparecer Sub o Function. Declara esto como un procedimiento Function delegado que devuelve un valor.
name Necesario. Nombre del tipo de delegado; sigue las convenciones estándar de nomenclatura de variables.
typeparamlist Opcional. Lista de parámetros de tipo para este delegado. Los distintos tipos de parámetros se separan mediante comas. Opcionalmente, cada parámetro de tipo se puede declarar como variante mediante los modificadores genéricos In y Out. Debe incluir la lista de tipos entre paréntesis e introducirla con la palabra clave Of.
parameterlist Opcional. Lista de parámetros que se pasan al procedimiento cuando se le llama. Debe incluir la lista de parámetros entre paréntesis.
type Obligatorio si especifica un procedimiento Function. Tipo de datos del valor devuelto.

Comentarios

La instrucción Delegate define el parámetro y los tipos de valores devueltos de una clase de delegado. Cualquier procedimiento con parámetros coincidentes y tipos devueltos puede usarse para crear una instancia de esta clase de delegado. Después, el procedimiento se puede invocar posteriormente mediante la instancia de delegado llamando al método Invoke del delegado.

Los delegados se pueden declarar en el nivel de espacio de nombres, módulo, clase o estructura, pero no en un procedimiento.

Cada clase delegada define un constructor que se pasa la especificación de un método de objeto. Un argumento para un constructor delegado debe ser una referencia a un método o una expresión lambda.

Para especificar una referencia a un método, utilice la siguiente sintaxis:

AddressOf [expression.]methodname

El tipo de tiempo de compilación de expression debe ser el nombre de una clase o una interfaz que contiene un método del nombre especificado cuya firma coincida con la firma de la clase delegada. methodname puede ser un método compartido o un método de instancia. methodname no es opcional, incluso si se crea un delegado para el método predeterminado de la clase.

Para especificar una expresión lambda, utilice la siguiente sintaxis:

Function ([parm As type, parm2 As type2, ...]) expression

La firma de la función debe coincidir con la del tipo de delegado. Para obtener más información sobre las expresiones lambda, vea Expresiones lambda.

Para obtener más información sobre los delegados, consulte Delegados.

Ejemplo

En el ejemplo siguiente se usa instrucción Delegate para declarar un delegado a fin de operar en dos números y devolver uno. El método DelegateTest toma una instancia de un delegado de este tipo y lo usa para operar en pares de números.

Delegate Function MathOperator( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double

Function AddNumbers( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double
    Return x + y
End Function

Function SubtractNumbers( 
    ByVal x As Double, 
    ByVal y As Double
) As Double
    Return x - y
End Function

Sub DelegateTest( 
    ByVal x As Double, 
    ByVal op As MathOperator, 
    ByVal y As Double 
)
    Dim ret As Double
    ret = op.Invoke(x, y) ' Call the method.
    MsgBox(ret)
End Sub

Protected Sub Test()
    DelegateTest(5, AddressOf AddNumbers, 3)
    DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub

Consulte también