En C#, los delegados (delegates) son los bloques de construcción básicos para los eventos. Un delegado define la firma de un método. E C++, por ejemplo, se podría decir que es un apuntador de función. En C# puede instanciar un delegado y permitir que apunte a otro método. Puede invocar el método a través del delegado.
using System;
using System.IO;
using System.Threading.Tasks;
namespace CovarianceWithDelegates
{
public class MyDelegate
{
public delegate int Calculate(int x, int y);
public int Add(int x, int y) { return x + y; }
public int Multiply(int x, int y) { return x * y; }
public void UseDelegate()
{
Calculate calc = Add;
Console.WriteLine(calc(3, 4)); // presenta 7
calc = Multiply;
Console.WriteLine(calc(3, 4)); // presenta 12
}
}
class Program
{
static void Main(string[] args)
{
MyDelegate del = new MyDelegate();
del.UseDelegate();
}
}
}
Otra característica de los delegados es que puede combinarlos. Esto se llama multicasting. Puede usar los operadores + o += para agregar otros métodos. Para invocar la lista de una instancia de un delegado existente, como se ve en el siguiente ejemplo.
using System;
namespace UsingMulticastDelegate
{
public class MulticastDelegate
{
public void MethodOne()
{
Console.WriteLine("MethodOne");
}
public void MethodTwo()
{
Console.WriteLine("MethodTwo");
}
public delegate void Del();
public void MultiCast()
{
Del d = MethodOne;
d += MethodTwo;
d();
}
}
class Program
{
static void Main(string[] args)
{
MulticastDelegate mul = new MulticastDelegate();
mul.MultiCast();
}
}
}
También es posible remover un método de la lista de invocación usando el operador de decrement (- o -=)
Todo esto es posible porque los delegados heredan desde la clase System.MulticastDelegate que a su vez hereda de System.Delegate. POr eso puede usar los miembros que son definidos en esta clase base en sus delegados.
Por ejemplo, para encontrar el número de métodos en un delegado multicast puede llamar a GetInvocationList().GetLength(0), como en el siguiente ejemplo.
using System;
namespace UsingMulticastDelegate
{
public class MulticastDelegate
{
public void MethodOne()
{
Console.WriteLine("MethodOne");
}
public void MethodTwo()
{
Console.WriteLine("MethodTwo");
}
public delegate void Del();
Del d;
public void MultiCast()
{
d = MethodOne;
d += MethodTwo;
d();
}
public int GetLengthDelegate()
{
return d.GetInvocationList().GetLength(0);
}
}
class Program
{
static void Main(string[] args)
{
MulticastDelegate mul = new MulticastDelegate();
mul.MultiCast();
Console.WriteLine("GetInvocationList().GetLength(0) = {0}",
mul.GetLengthDelegate());
}
}
}
Referencia:
Exam Ref 70-483 Programming in C#
No hay comentarios.:
Publicar un comentario