C#, tratando de entender los Delegados

Que son los Delegados

Un delegado en C#  es un puntero a un método, es decir, es una referencia a través de la que se puede acceder a un método. Al crear un delegado deben describirse el tipo y número de sus argumentos y el tipo devuelto por este.

  public delegate int CharCounter(string source,char match);

Después de que se ha creado un delegado, el método con el que está asociado nunca cambia; los objetos delegados son inmutables.

 

Como vemos CharCounter es un delegado sobre métodos que acepten una cadena y un carácter  como argumentos y devuelvan un  entero.

Sintaxis

Su sintaxis es

delegate <Tipo Devuelto> <Nombre del delegado> <Lista de parámetros>

Se pueden crear instancias de los delegados que serán las que utilizaremos para invocar sus métodos

Una instancia del delegado anterior podría ser

      CharCounter firstCharCounter = new CharCounter(GetNumChars);

Donde GetNumChars, es un método que cumple el formato de declaración del delegado en cuanto a número y tipo de sus argumentos y valor devuelto.

 

   public static int GetStringCharCounter(string source, char match) { 
           return source.Count(c=>c==match); 
      }

También podríamos asignarle directamente al delegado el método que invoca

CharCounter secondCharCounter = GetNumChars;

Asignarle una función lambda

CharCounter thirdCharCounter = (string source, char match) =>{

return source.Count(c => c == match);

};

O inicializarlo y asignarle el método a continuación

  
CharCounter fouthCharCounter = null;

fouthCharCounter += GetNumChars;

Invocación

La invocación de a estas instancias puede realizarse  pasando directamente los parámetros

 

Console.WriteLine("Tiene {0} caracteres 's'", firstCharCounter(sentence, 's'));

 

Llamando al método invoke

 


Console.WriteLine("Tiene {0} caracteres 'o'", firstCharCounter.Invoke(sentence, 'o'));

 

O en asíncrono llamando a BeginInvoke

 

Console.WriteLine("Tiene {0} caracteres 's'", firstCharCounter.BeginInvoke(sentence, 's',null,null));

 

En este caso al necesitar el resultado necesitamos añadir también EndInvoke

 

Console.WriteLine("Tiene {0} caracteres 's'", firstCharCounter.EndInvoke (firstCharCounter.BeginInvoke(sentence, 's',null,null)));

 

 

Un delegado puede tener varios métodos asociados, el conjunto de métodos que se asignan al delegado se llama lista de invocaciones

Cuando esta lista tiene más de un elemento, el delegado internamente pasa  a convertirse en un MultiCastDelegate, cuando se invoque con unos determinados parámetros llamará a toda su lista de invocaciones con esos mismos parámetros.

Por ejemplo pensemos que queremos hacer varias cosas con una cadena y a continuación hacer otras distintas

Podríamos declarar un delegado

 

public delegate void DoThings(string source);

 

y agregarle  un par de invocaciones distintas

 

 

DoThings doThings = DoThingsWithString;

doThings += DoMoreThingsWithString;

 

public static void DoThingsWithString(string source)

{

//Do things

Console.WriteLine("Doing things with string {0}" ,source);

}

public static void DoMoreThingsWithString(string source)

{

//Do More things

Console.WriteLine("Doing more things with string {0}", source);

}

 

Cuando ejecutemos el delegado

doThings(“PALABRA”);

Se llamará a DoThingsWithString y a continuación a DoMoreThingsWithString.

Etiquetas:,

Deja un comentario

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar