当我刚学习C#是接触事件时,就在思考它是怎样一种机制,直到深入的接触委托对事件有了更深刻的认识,这是一个回到函数,在.NET Framework 中运用的很广泛,如窗体状态变化,菜单选项等等。那有没有思考过它是如何实现的那,这就要说到委托 ,委托是一个类似于C中的函数指针的东西,但C#提供给委托更为安全的类型机制。
下面给大家掩饰一下委托的声明创建和使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyDelegate
{
class Program
{
public delegate void FunBock(int value);
static void Main(string[] args)
{
Program p = new Program();
StaticDelegate();
instanceDelegate(p);
chainDelete(p );
}
public static void counter(int from,int tow , FunBock fb)
{
for (int i = from; i <= tow; i++)
{
if (fb != null)
fb(i);
else return;
}
}
// 代理静态方法
public static void StaticDelegate()
{
Console.WriteLine("-------------代理静态函数----------------");
Program.counter(0,1,null);
Program.counter(0, 1, new FunBock(Program.StaticFunction ));
Console.WriteLine();
}
//代理实例方法
public static void instanceDelegate(Program p )
{
Console.WriteLine("------------代理实例方法----------------");
Program.counter(0, 1, null);
Program.counter(0, 1, new FunBock(p.ObjectFunction ));
Console.WriteLine();
}
//代理串行函数
public static void chainDelete(Program p )
{
Console.WriteLine("------------代理串行函数----------------");
FunBock fb1 = null;
fb1 =(FunBock)Delegate.Combine(fb1, new FunBock(p.ObjectFunction));
fb1 = (FunBock)Delegate.Combine(fb1,new FunBock(Program.StaticFunction));
Program.counter(0, 1, fb1);
Console.WriteLine();
}
public void ObjectFunction(int value )
{
Console.WriteLine("ObjectFunction方法 值是:" + value);
}
private static void StaticFunction(int value )
{
Console.WriteLine("StaticFunction方法 值是:" + value);
}
}
}
解析:delegate是委托声明,声明指定了一个委托函数的签名。在本例中采用一个int的参数无返回类型的委托,这就声明了所有的无返回类型的有一个int类型参数的所有函数都为它的指向值,类似与类与实例对象的概念,FunBock类,所有满足约束条件的方法都可以看作这个类的实例!
关于chainDelete实现了链式的代理将在委托链中详细讲解!