Delegate (Instrucción)

Actualización: noviembre 2007

Se utiliza para declarar un delegado. Un delegado es un tipo de referencia que se establece para un método Shared de un tipo o para un método de instancia de un objeto. Se puede usar cualquier procedimiento con parámetro de coincidencia y tipos devueltos para crear una instancia de esta clase delegada. Se puede llamar al procedimiento por medio de la instancia de delegado.

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

Partes

  • attrlist
    Opcional. Lista de atributos que se aplican a este delegado. Los atributos múltiples se separan por comas. Debe incluir la lista Lista de atributos entre corchetes angulares ("<" y ">").

  • accessmodifier
    Opcional. Especifica qué código puede tener acceso al delegado. Puede ser una de las siguientes:

    • Public Cualquier código que puede tener acceso al elemento que declara el delegado.

    • Protected Sólo el código de la clase del delegado o de una clase derivada.

    • Friend Sólo el código incluido en el mismo ensamblado.

    • Private Sólo el código incluido en el elemento que declara el delegado.

    Puede especificar Protected Friend para habilitar el acceso desde el código incluido en la clase delegada, en una clase derivada o en el mismo ensamblado.

  • Shadows
    Opcional. Indica que este delegado vuelve a declarar y ocultar un elemento de programación con el mismo nombre, o un conjunto de elementos sobrecargados, en una clase base. Puede hacer que cualquier tipo de elemento declarado prevalezca sobre cualquier otro tipo.

    Un elemento sombreado no está disponible desde la clase derivada que lo sombrea, a menos que el elemento que produce el sombreado no esté accesible. Por ejemplo, si un elemento Private sombrea un elemento de clase base, el código que no tiene el permiso para obtener acceso al elemento Private obtiene acceso al elemento de clase base.

  • Sub
    Opcional, pero debe aparecer Sub o Function. Declara este procedimiento como un procedimiento Sub delegado que no devuelve ningún valor.

  • Function
    Opcional, pero debe aparecer Sub o Function. Declara este procedimiento como un procedimiento Function delegado que devuelve un valor.

  • name
    Obligatorio. Nombre del tipo delegado. Sigue las convenciones de nomenclatura estándar de las variables.

  • typeparamlist
    Opcional. Lista de parámetros de tipo de este delegado. Los parámetros de tipo están separados por comas. Debe incluir la lista Lista de tipos entre paréntesis y anteponer la palabra clave Of.

  • parameterlist
    Opcional. Lista de parámetros que se transfieren al procedimiento cuando se llama. Debe incluir la lista Lista de parámetros entre paréntesis.

  • type
    Obligatorio si se especifica un procedimiento Function. Tipo de datos del valor devuelto.

Comentarios

La instrucción Delegate define el parámetro y los tipos devueltos de una clase delegada. Se puede usar cualquier procedimiento con tipos de parámetros de coincidencia y tipos de valor devuelto para crear una instancia de esta clase delegada. Se puede llamar al procedimiento 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 al cual 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 sintaxis siguiente:

AddressOf [expression.]methodname

El tipo de tiempo de compilación de expression debe ser el nombre de una clase o interfaz que contenga 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. Aunque se cree un delegado para el método predeterminado de la clase, methodname no es opcional.

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

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

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

Ejemplo

En el ejemplo siguiente se utiliza la instrucción Delegate para declarar un delegado que opere con dos números y devuelva un número. El método DelegateTest toma una instancia de un delegado de este tipo y la utiliza para ordenar los números en pares.

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

Vea también

Tareas

Cómo: Utilizar una clase genérica

Conceptos

Tipos genéricos en Visual Basic

Referencia

AddressOf (Operador)

Of

Otros recursos

Delegados de Visual Basic