什么是委托?
安全的函数指针
系统委托Func、Action前者有返回值,后者没有
public delegate void Del(); public delegate string DelStr(string name); class Program { static string Name = string.Empty; static void Main(string[] args) { //Del del = Test; //Del del = delegate() { }; //=>goes to 去执行 //Del del = () => { }; //DelStr del = Demo; //DelStr del = delegate(string name) { return name; }; DelStr del2 = (name) => { Name = name; return Name; }; Demo("张三", del2); Console.ReadKey(); } static void Test() { } static void Demo(string name,DelStr del) { del(name); Console.WriteLine(Name); } }
事件
class Program { static void Main(string[] args) { Eat eat = new Eat(); eat.del += End;//绑事件,必须在触发事件之前绑定,否则事件将不被触发 eat.EatFood("火锅涮羊肉"); Console.ReadKey(); } static void End() { Console.WriteLine("吃完了"); } } public delegate void Del();//声明委托 class Eat { public event Del del;//注册委托类型的事件,事件是一种特殊的委托 public void EatFood(string food) { Console.WriteLine("正在吃" + food); Thread.Sleep(3000);//吃3秒 if (del!=null) { del();//如果事件不为空,触发事件 } } }
+=、-=多播委托
委托是不安全的,事件就是一个类型安全的委托
委托的作用:
站位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null
事件的作用:
事件的作用与委托一样,只是功能上比委托变量有更多的限制。(比如:1、只能通过+=或-=来绑定方法(事件处理程序)2、只能在类内部调用(触发)事件)
事件最终形式
class Program { static Eat eat = new Eat("火锅涮羊肉"); static void Main(string[] args) { eat.Del += eat_Del; eat.EatFood(); Console.ReadKey(); } //事件绑定函数 static void eat_Del(object sender, EventArgs e) { Console.WriteLine(eat.Food+"吃完了"); } } class Eat { public event EventHandler Del;//声明事件 public string Food { get; set; } public Eat(string food){ this.Food = food; } public void EatFood() { Console.WriteLine("正在吃"+this.Food); Thread.Sleep(3000); if (Del != null) { EventArgs e = new EventArgs(); //this事件源,此处是命名空间.类名 Del(this, e); } } }