Translate

lunes, 17 de mayo de 2021

Delegate en C# parte 3

Seguimos con delegate en C# 


Los Generic Delegate no requieren la definición de una instancia de un delegado para invocar a los métodos.

Existen tres tipos de Generic delegate:

Generic Delegate: Func

El delegado Func define un método que puede ser llamado con argumentos y devolver un valor. Existen varias sobrecargas de este delegado.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

public class Test

{

  public static void Main()

  {

    // Definir el delegado Func con parámetro de entrada de tipo int y devuelve un string

    Func<int, string> showIntToString = delegate(int i)

    {

      return i.ToString();

    };

 

    // Definir el delegado Func con parámetro de entrada de tipo string y devuelve un int

    Func<string, int> showStringToInt = s => 

    {

      return int.Parse(s);

    };

 

    // Llamar a los delegados

    Console.WriteLine(showIntToString(16));

    Console.WriteLine(showStringToInt("55")); 

  }

}

El delegado Action define un método que puede ser llamado con argumentos pero NO devuelve un valor. Existen varias sobrecargas de este delegado.


Un ejemplo básico de este delegado podría ser:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

public class Test

{

  public static void Main()

  {

    // Definir el delegado Action con parámetro de entrada de tipo int

    Action<int> showIntToString = delegate(int i)

    {

      Console.WriteLine("El valor pasado al delegado como parámetro es: {0}", i);

    };

 

    // Definir el delegado Action con parámetro de entrada de tipo string

    Action<string> showStringToInt = s => 

    {

      Console.WriteLine("El valor pasado al delegado como parámetro es: {0}", s);

    };

 

    // Llamar a los delegados

    showIntToString(16);

    showStringToInt("55"); 

  }

}

El delegado Predicate define un método que puede ser llamado con argumentos pero SIEMPRE devuelve un valor de tipo bool. Existen varias sobrecargas de este delegado.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

public class Test

{

  public static void Main()

  {

    string validNumber = "28";

    string invalidNumber = "28z";

 

    // Definir el delegado Predicate con parámetro de entrada de string

    Predicate<string> isValidNumber = d => IsNumber(d);

 

    if (isValidNumber(validNumber))

    {

      Console.WriteLine("El número {0} es válido", validNumber);

    }

    else

    {

      Console.WriteLine("El número {0] NO es válido", validNumber);

    }   

    

    if (isValidNumber(invalidNumber))

    {

      Console.WriteLine("El número {0} es válido", invalidNumber);

    }

    else

    {

      Console.WriteLine("El número {0} NO es válido", invalidNumber);

    }

  }

 

  private static bool IsNumber(string number)

  {

    Decimal d;

    return Decimal.TryParse(number, out d);

  }

}