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; } }

7 thoughts on “C Sharp (C#) – Usar delegados – Parte 1

  1. Pingback: C Sharp (C#) – Usar Delegados – Parte 3 « El Blog de Writkas!!

  2. porque siempre todo lo hacen modo consola? quiero hacerlo en modo windows y cuando trato de meter 3 metodos, y cada uno una variable tipo cadena, me comentan el compilador que se esperaba una instrucción Get o Set???

  3. Es que yo por costumbre utilizo el modo consola, así se mejor lo que hago xD

    Pero ¿Cómo lo estás haciendo?, para meter más de un objeto delegado tienes que utilizar los operadores += como se explica en el siguiente artículo.

    Tal vez podríamos mostrar el código o el error que te lanza 😀

  4. Hola que tal Matias, clara tu explicacion. Solo tengo una duda, dejo en claro que mi experiencia con c# se limita a una semana, asi que podria desconocer muchas cosas pero…

    En vez de:
    MiDelegado objDelegado = new MiDelegado (objOtraClase.Función1);

    No seria:
    MiDelegado objDelegado = new MiDelegado (objOtraClase.Metodo1);

    Lo de los acentos supongo que es otro rollo.
    Muchas gracias, voy a leer tus otros articulos.

  5. en vez de:
    MiDelegado objDelegado = new MiDelegado (objOtraClase.Función1);

    seria:
    MiDelegado objDelegado = new MiDelegado (objOtraClase.Metodo1);

    o estoy mal? apenas ando aprendiendo a hacer uso de los delegados.

    gracias!

  6. Hola, si esta bién me equivoqué con eso de “función1” es que quería remplazar la palabra fución1 por método1 y no me di cuenta que no las remplace todas. Y se puede utilizar acentos en c sharp porque utiliza la codificación de carácteres UTF-8 (si mal no recuerdo). Pero parece que tampoco es muy aconsejable. De todas formas siempre se recomienda escribir el código en inglés, pero en este caso, para explicar sería mejor en español.

    Trato de que el código se más fácil de entender, incluso hay cosas que se podrían hacer en una sola linea de código, pero las separo para poder explicar mejor.

    Voy a cambiar eso de función1. Le voy a cambiar el nombre porque no son funciones sino métodos.

    saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s