委托:关键字delegate,委托并不不等同于方法,而是一个引用类型,类似于C++中的指针,委托本质上是一个类
一:声明一个委托
namespace Test.Delegate { public static class JieShouValue { //声明一个委托 public delegate void ValDelegate(int day); //声明一个委托变量 public static ValDelegate UserHt; //创建一个方法 public static void chafa(int day) { Console.WriteLine("你好+"+day); } } }
class Program { //声明一个委托 public delegate void MyDelegate(int userId, string userName); static void Main(string[] args) { MyDelegate md=new MyDelegate(GetValue); md(2016, "wangds"); JieShouValue.UserHt=new JieShouValue.ValDelegate(Jian); JieShouValue.UserHt(2017); JieShouValue.UserHt = new JieShouValue.ValDelegate(JieShouValue.chafa); JieShouValue.UserHt(2018); Console.ReadKey(); } //方法 public static void GetValue(int id, string name) { Console.WriteLine("id="+id+"name="+name); } //方法 public static void Jian(int day) { Console.WriteLine("day=" + day); } }
委托的实现原理:在静态类JieShouValue中声明一个ValDelegate委托类型,里面还有一个和方法,方法参数和委托的参数类型和数量相同,即是委托的关联方法。
实例化委托的时候,将方法JieShouValue.chafa传递给ValDelegate构造器,即将chafa指派给ValDelegate委托,并将该引用赋值给JieShouValue.UserHt变量,也就表示UserHt变量保存了指向chafa方法的引用,以此来实现对chafa的回掉。
委托链
class Program { //声明一个委托 public delegate void MyDelegate(int userId, string userName); static void Main(string[] args) { MyDelegate md=new MyDelegate(GetValue); md(2016, "wangds"); //进行绑定(+=是进行绑定,-=是解除绑定) JieShouValue.UserHt+=new JieShouValue.ValDelegate(Jian); JieShouValue.UserHt += new JieShouValue.ValDelegate(JieShouValue.chafa); JieShouValue.UserHt(2018); Console.ReadKey(); } //方法 public static void GetValue(int id, string name) { Console.WriteLine("id="+id+"name="+name); } //方法 public static void Jian(int day) { Console.WriteLine("day=" + day); } }
委托链中,+=操作调用的是Delegate.Combine方法
-=操作调用的是Delegate.Remove方法