concepto de delegate

03/10/2005 - 22:45 por lucho | Informe spam
Gente:

¿Cual es el concepto de : delegate?
 

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
04/10/2005 - 05:19 | Informe spam
Un "Delegate" declara el prototipo de una funcion.
Un prototipo determina cuales son los argumentos que dicha funcion
recibe y la clase de valor que devuelve.



En mi opinion, mas que ser una especie de prototipo es un apuntador a
funcion "seguro". Por seguro se entiende a que especifica cantidad y tipos
de los parametros y su valor de retorno (si lo hay).

El valor practico:



Yo diria que el valor practico mas comun son los eventos. En VB.NET esto
queda medio oculto ya que al declarar un Event con la sintaxis de VB6 el
compilador crea un delegado para el evento.

Otra cosa a tener en cuenta con los delegados es que no son intercambiables,
es decir, si tienes definidos dos delegados con los mismos parametros y
valor de retorno no puedes asignar una instancia de uno a otro. Por ejemplo:

Delegate Sub Abc1(ByVal s As String)
Delegate Sub Abc2(ByVal s As String)

Dim test As Abc1

test = New Abc2(AddressOf x) ' Error

Pese a que los dos delegados tienen la misma definicion cada uno es
diferente. Esto no es muy notorio en VB ya que puede evitarse crear
explicitamente el delegado (con AddressOf basta para que el compilador cree
el delegado correspondiente, siempre que pueda) pero en C# si debe crearse
en forma explicita.

Otra particularidad es que a diferencia de un apuntador a funcion de C, un
delegado puede contener referencias a mas de una funcion al mismo tiempo
(esta es la propiedad que se aprovecha para eventos). Ejemplo:

Delegate Sub Abc(ByVal s As String)

Dim test As Abc

' Creo una instancia que apunte al metodo Metodo1
' Notar que no hace falta New Abc().
test = AddressOf Metodo1

' Creo una instancia que apunte al metodo Metodo2
' y la combino con la instancia anterior.
' Notar que hay que crear explicitamente el delegado.
test = [Delegate].Combine(test, New Abc(AddressOf Metodo2))

' Invoco el delegado, este llamara a Metodo1 y Metodo2
test("hola")

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C

Preguntas similares