C Sharp (C#) – Usar Delegados – Parte 3

¿Cuándo se ocupan los delegados?

Los delegados pueden ser utilizados en distintas ocasiones, también pueden no ser utilizados como en el caso del lenguaje Java. Pero la idea de aprender a usar los delegados es para ser mas eficiente a la hora de programar y ahorrar lineas de código. Al principio usar palabras claves nuevas en un lenguaje de programación moderno puede ser difícil pero cuando ya lo aprendes será mas intuitivo y más eficiente.

Los delegados se pueden usar cuando:

  • Se llama a varios métodos con una sola llamada (Multidifución). A los objetos delegados se les puede asignar métodos y luego llamarlos todos de forma ordenada, con una sola llamada desde el objeto delegado.
  • Se pasan métodos como parámetros. Gracias a usar un tipo delegado como parámetro.
  • La ordenación de un conjunto de elementos. Por ejemplo, ordenar una secuencia de métodos.
  • Se utilice un modelo de diseño de eventos. Los eventos son como las propiedades, son una forma de acceder a los delegados. Dan una respuesta cuando se le asigna y/o quita un método a un evento que representa un objeto delegado (parecido a las propiedades representan a las variables).
  • Se prefiere a la hora de encapsular un método estático. Con llamar a un objeto delegado se puede acceder para llamar a métodos estáticos privados de otra clase (no la clase en la cual esta el autor de la llamada al objeto delegado), sin tener que llamarlos directamente (ya que no se puede llamar a miembros (métodos, variables, propiedades, etc)  privados de forma directa desde otra clase).
  • El autor de la llamada no tiene ninguna necesidad de obtener acceso a otras propiedades, métodos o interfaces de el objeto.
  • Una clase puede necesitar mas de una implementación (realización de una especificación técnica) de métodos.
  • Se desea conseguir una composición sencilla.
  • Para realizar devolución de llamadas asíncronas (en un hilo de ejecución a parte) y finalizar llamadas asíncronas.
  • Cambios en bases de datos. Por ejemplo, a partir de un cambio de ‘x’ tabla se genera una respuesta ‘y’.
  • Asociación de código a la carga y descarga de ensamblados.
  • Cambios en el sistema de archivos. Por ejemplo al borrar ‘x’ archivo se escribe un registro en otro archivo ‘y’, que contiene datos del archivo borrado.
  • Etc.

Si no quedaron muy claras algunas cosas, más adelante se verán. También veremos algunos ejemplos ilustrativos (para aprender a usar los delegados) y ejemplos en un contexto ‘más o menos real’ (ya que son solo ejemplos).

¿Dudas?, ¿sugerencias?, ¿opiniones?, ¿errores?, ¿insultos?

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

  1. C Sharp (C#) – Usar delegados – Ejemplo mínimo sobre delegados
  2. C Sharp (C#) – Usar delegados – Añadir y quitar métodos a un objeto delegado
  3. C Sharp (C#) – Usar delegados – ¿Cuándo se ocupan los delegados?
  4. C Sharp (C#) – Usar delegados – Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp

.

(parte 2: Añadir y quitar métodos a un objeto delegado) Artículo anterior | Artículo siguiente (parte 4: Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp)

C Sharp (C#) – Usar Delegados – Parte 2

Añadir y quitar métodos a un objeto delegado

En realidad los delegados no son un tema corto, por lo que irán varios mini artículos mas. También, en el ejemplo del mini artículo anterior, se añadió un solo método a un objeto delegado, pero había dicho que también se pueden añadir uno o mas métodos a un objeto delegado y luego en el caso de ser varios métodos se podían ejecutar de forma ordenada a través del objeto delegado (también se puede ejecutar de otras formas pero, ya se vera eso mas adelante). En este mini artículo se verá como añadir y quitar métodos a un objeto delegado y ejecutarlos de forma ordenada.

Normalmente cuando se crea un objeto delegado, en la misma linea (o sentencia) se incluye el primer método que le asignamos. Pero ¿como añadimos más métodos a un objeto delegado? en el caso de que se quera añadir o quitar métodos a un objeto delegado, se usa los operadores ‘+=’ para añadir y ‘-=’ para quitar métodos. Estos son operadores sobrecargados para que el uso de los objetos delegados sean mas intuitivos.

Ejemplo de como añadir y quitar métodos a un objeto delegado

// por Writkas, archivo sin derechos reservados.
// Delegados2.cs : Añadir y quitar métodos a un objeto delegado

using System;

public class Programa
{
 // Se crea y define un tipo delegado, se puede definir también dentro de una clase.
 // Se define el tipo delegado, tipo de retorno, numero de parámetros y tipos de parámetros. Los
 // métodos a asignar al objeto delegado deben cumplir con esta definición, o si no dará error.
 public delegate void TipoDelegado ();

 public static void Main ()
 {
   Console.WriteLine ("Se inicia el programa");

 // Se crea una objeto de la clase Programa
   Programa objPrograma = new Programa ();

 // Se crea un objeto de el tipo delegado y se le añade un método. No importá si el método es de
 // un objeto de la propia clase
   TipoDelegado objDelegado = new TipoDelegado (objPrograma.Método1);

 // Se añade al objeto delegado un método, ahora el objeto delegado tendrá 2 métodos añadidos.
 // Al añadir un primer método a un delegado se puede usar el operador de asignación '=' pero
 // si quisiéramos añadir otro método se tiene que usar el operador '+=' , como lo siguiente.
   objDelegado += new TipoDelegado (objPrograma.Método2);

   Console.WriteLine ("Se llamará al objeto delegado con los métodos ya asignados");
   objDelegado ();

   Console.WriteLine ("Se llamará al objeto delegado después de quitar Método2");
 // Quitar el método 'Método2' y luego llamar al objeto delegado
   objDelegado -= new TipoDelegado (objPrograma.Método2);
   objDelegado ();

 // Se puede añadir el mismo método mas de una ves
   Console.WriteLine ("Se añade -de nuevo- Método1");
   objDelegado += new TipoDelegado (objPrograma.Método1);
   objDelegado ();
 }

 // Observa que los métodos cumplen con la definición del tipo delegado
 public void Método1 ()
 {
   Console.WriteLine ("Soy Método1");
 }

 public void Método2 ()
 {
   Console.WriteLine ("Soy Método2");
 }
}

El resultado es (en Linux usando Mono y el Terminal) ->

writkas@linux-e1ht:~/proyectos> mcs Delegados2.cs
writkas@linux-e1ht:~/proyectos> mono Delegados2.exe
Se inicia el programa
Se llamará al objeto delegado con los métodos ya asignados
Soy Método1
Soy Método2
Se llamará al objeto delegado después de quitar Método2
Soy Método1
Se añade -de nuevo- Método1
Soy Método1
Soy Método1
writkas@linux-e1ht:~/proyectos>

Enfatizo

  • Un tipo delegado se puede definir dentro de una clase, fuera de una clase, dentro de un namespace o fuera de un namespace.
  • Al inicializar un objeto delegado, se le puede asignar un método usando el operador ‘=’ , pero para asignar o quitar otros métodos al objeto delegado se tiene que usar los operadores ‘+=’ y ‘-=’.
  • Para añadir y quitar un método a un objeto delegado se utilizan los operadores ‘+=’ para añadir y ‘-=’ para quitar un método.
  • Al llamar al objeto delegado se ejecutan los métodos que almacena de forma ordenada, salen al mismo orden de como se añadieron. Osea, si se añade Método1 y luego Método2, al llamar al objeto delegado saldrán Método1 primero y luego Método2.
  • Un mismo método se puede añadir a un objeto delegado más de una ves.

Ya irán mas mini artículos sobre el tema sobre usar delegados en C Sharp. Puede que gente que sabe sobre este tema diga que estoy ignorando muchas cosas sobre este tema los delegados, pero eso estoy haciendo, para ir de forma ordenada y que se entienda mejor el tema.

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

  1. C Sharp (C#) – Usar delegados – Ejemplo mínimo sobre delegados
  2. C Sharp (C#) – Usar delegados – Añadir y quitar métodos a un objeto delegado
  3. C Sharp (C#) – Usar delegados – ¿Cuándo se ocupan los delegados?
  4. C Sharp (C#) – Usar delegados – Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp
  5. C Sharp (C#) – Usar delegados – Usar delegados para facilitar el uso de eventos

.

(Parte 1: Añadir y quitar métodos a un objeto delegado) Artículo anterior | Artículo siguiente (Parte 3: ¿Cuándo se usan los delegados?)

C Sharp (C#) – Usar delegados – Parte 1

Ejemplo mínimo sobre delegadosLogo no oficial de C#

C Sharp es un lenguaje de programación para los proyectos Mono y .Net . Este lenguaje de programación, a diferencia de otros, trae bastantes palabras claves (keywords) para facilitar la vida de los programadores, la palabra clave delegate es una de ellas. El equivalente de los delegados en el lenguaje C/C++ sería un puntero a función (callback). Pero por la complejidad de los punteros a función de el lenguaje C/C++ muchas veces  se producen bugs y errores en tiempo de ejecución. C# soluciona el problema incluyendo los delegados. Para crear un delegado se usa la palabra clave delegate, la razón para crear esta palabra clave es por que aporta más seguridad. Considero bueno que los lenguajes de programación tengan muchas palabras claves, aunque cuesta mas aprenderlas ya que son más temas de estudio. Es una inversión para ser más rápido e eficiente a la hora de crear una aplicación. 

¿Qué es un delegado en C Sharp?

Antes, creo importante hacer una diferenciación entre lo que es un objeto delegado y un tipo delegado, por que son distintos y se hablara de ellos en todos los mini artículos.

  • Un tipo delegado es el que se define con la palabra clave delegate
  • En cambió un objeto delegado es una instancia de ese tipo delegado.

Esquema de un tipo delegado a un objeto delegado

Un delegado es un tipo en el cual hay que definir (o firma) que debe cumplir el o los métodos a añadir a su objeto delegado. El objeto delegado puede solicitar llamar a uno o más de el o los métodos añadidos a la vez.

,

Ejemplo sobre delegado en C Sharp

// por Writkas, archivo sin derechos reservados.
// Delegados1.cs : Ejemplo mínimo sobre delegados

using System;

// Un delegado puede estar dentro de una clase, fuera de una clase, dentro de
// un namespace o fuera de un namespace.

// Se crea y define el -tipo- delegado, en la definición (o firma) de un tipo delegado
// se consideran: el tipo de retorno, número de parámetros y el tipo de los parámetros,
// con estas características deben cumplir los métodos que luego se asignarán.
// Para crear un tipo delegado se usa la palabra clave delegate
public delegate int MiDelegado (int parámetro);  // Es muy similar a declarar un método

public class Programa
{
  public static void Main ()
  {
    Console.WriteLine ("Se inicia el programa");

  // Se crea un objeto de la clase 'OtraClase'
    OtraClase objOtraClase = new OtraClase ();

  // Se crea un objeto delegado y se le asigna un método, en este ejemplo le
  // asignamos solo un método, pero se le pueden asignar más.
  // Crear un objeto delegado es muy similar a crear un objeto con una clase, la
  // diferencia es que le asignamos un método.
  // El método no se llama usando '()' solo se le asigna al objeto delegado, por eso
  // no se usan los '()'
    MiDelegado objDelegado = new MiDelegado (objOtraClase.Método1);

  // Se crea una variable de tipo int y se le asigna el valor de retorno
  // del objeto delegado, que es el mismo retorno de el método anteriormente asignado
    int retorno = objDelegado (5); // Se hace la llamada de la misma forma que un método

  // Muestra el valor de retorno
    Console.WriteLine ("El valor devuelto es {0}", retorno);
  }
}

public class OtraClase
{
  // Este método cumple con el prototipo de el delegado al cual se lo asignamos
  public int Método1 (int a)
  {
    Console.WriteLine ("Soy Método1 y mi argumento es: {0}", a);
    return a + 10;
  }
}

.
Compilar y ejecutar el programa

writkas@linux-xag2:/home/writkas/> gmcs Delegados1_Comentado.cs
writkas@linux-xag2:/home/writkas/> mono Delegados1_Comentado.exe
Se inicia el programa
Soy Método1 y mi argumento es: 5
El valor devuelto es 15
writkas@linux-xag2:/home/writkas/>

Recuerda

  • Un tipo delegado es el cual se define con la palabra clave delegate y un objeto delegado es el objeto de el tipo que se definió anteriormente. También cuando se habla de un delegado es lo mismo que hablar de un tipo delegado.
  • Un tipo delegado se define de forma muy parecida a definir un método de una clase. La diferencia es que se usa la palabra clave delegate y otras cosas.
  • El tipo delegado crea un objeto delegado de la misma forma que una clase, un objeto delegado se puede inicializar asignando el nombre de el método que se quere añadir,  solo el nombre sin usar ‘()’ .
  • Se llama a un objeto delegado de la misma forma que a un método, osea se toma en cuenta el tipo de el valor de retorno, el número de parámetros y el tipo de el o los parámetros.

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

| Artículo siguiente (Parte 2: Añadir y quitar métodos a un objeto delegado)

// por Writkas, archivo sin derechos reservados. // Delegados1.cs : Ejemplo mínimo sobre delegadosusing System;// Un delegado puede estar dentro de una clase, fuera de una clase, dentro de // un namespace o fuera de un namespace.  // Se crea y define el -tipo- delegado, en la definición (o firma) de un tipo delegado // se consideran: el tipo de retorno, número de parámetros y el tipo de los parámetros, // con estas carácterísticas deben cumplir los métodos que luego se asignarán. // Para crear un delegado se usa la palabra clave delegate public delegate int MiDelegado (int parámetro);  // Es muy similar a declarar un método public class Programa { public static void Main () { Console.WriteLine (“Se inicia el programa”); // Se crea un objeto de la clase ‘OtraClase’ OtraClase objOtraClase = new OtraClase (); // Se crea un objeto delegado y se le asigna un método, en este ejemplo le // asignamos solo un método, pero se le pueden asignar más. // Crear un objeto delegado es muy similar a crear un objeto con una clase, la // diferencia es que le asinamos un método. // El método no se llama usando ‘()’ solo se le asigna al objeto delegado, por eso // no se usan los ‘()’ MiDelegado objDelegado = new MiDelegado (objOtraClase.Función1); // Se crea una variable de tipo int y se le asigna el valor de retorno // del objeto delegado, que es el mismo retorno de el método anteriormente asignado int retorno = objDelegado (5); // Se hace la llamada de la misma forma que un método // Muestra el valor de retorno Console.WriteLine (“El valor devuelto es {0}”, retorno); } } public class OtraClase { // Este método cumple con el prototípo de el delegado al cual se lo asignamos public int Función1 (int a) { Console.WriteLine (“Soy Función1 y mi argumento es: {0}”, a); return a + 10; } }