Delegate (Instrucción)

Se usa para declarar un delegado. Un delegado es un tipo de referencia que hace referencia a Shared un método de un tipo o a un método de instancia de un objeto . Cualquier procedimiento con parámetros y tipos de valor devueltos que coincidan se puede usar para crear una instancia de esta clase de delegado. A continuación, el procedimiento se puede invocar más adelante 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 tener acceso al delegado. Puede ser uno de los siguientes:

- Público. Cualquier código que pueda tener acceso al elemento que declara el delegado puede acceder a él.
- Protegido. Solo el código dentro de la clase del delegado o una clase derivada puede tener acceso a él.
- Friend . Solo el código dentro del mismo ensamblado puede tener acceso al delegado.
- Privado. Solo el código dentro del elemento que declara el delegado puede tener acceso a él.

- Protected Friend Solo el código dentro de la clase del delegado, una clase derivada o el mismo ensamblado pueden tener acceso al delegado.
- Private Protected Solo el código dentro de la clase del delegado o en una clase derivada del mismo ensamblado puede tener acceso al delegado.
Shadows Opcional. Indica que este delegado declara y oculta un elemento de programación con el mismo nombre, o 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 sombra un elemento de clase base, el código que no tiene permiso para tener acceso al elemento accede al Private elemento de clase base en su Private lugar.
Sub Opcional, pero debe Sub aparecer Function o . Declara este procedimiento como un procedimiento Sub delegado que no devuelve un valor.
Function Opcional, pero debe Sub aparecer Function o . Declara este procedimiento como un procedimiento Function delegado que devuelve un valor .
name Necesario. Nombre del tipo de delegado; sigue las convenciones de nomenclatura de variables estándar.
typeparamlist Opcional. Lista de parámetros de tipo para este delegado. Varios parámetros de tipo están separados por comas. Opcionalmente, cada parámetro de tipo se puede declarar como variant mediante los In Out modificadores genéricos y . Debe incluir la lista de tipos entre paréntesis e introducirla con la palabra Of clave .
parameterlist Opcional. Lista de parámetros que se pasan al procedimiento cuando se llama. Debe incluir la lista de parámetros entre paréntesis.
type Obligatorio si especifica un Function procedimiento. Tipo de datos del valor devuelto.

Comentarios

La Delegate instrucción define los tipos de parámetro y valor devuelto de una clase de delegado. Cualquier procedimiento con parámetros y tipos de valor devueltos que coincidan se puede usar para crear una instancia de esta clase de delegado. A continuación, el procedimiento se puede invocar más adelante mediante la instancia de delegado, llamando al método del Invoke delegado.

Los delegados se pueden declarar en el nivel de espacio de nombres, módulo, clase o estructura, pero no dentro de 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 más información sobre las expresiones lambda, consulte Expresiones lambda.

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

Ejemplo

En el ejemplo siguiente se usa Delegate la instrucción para declarar un delegado para operar con dos números y devolver un número. El método toma una instancia de un delegado de este tipo y DelegateTest 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

Consulta también