1. 多播委托
多播委托就是一个方法列表:+=在列表尾巴上加方法;-=就是从尾巴开始匹配,
只移除第一个完全吻合额方法,如果没有吻合,不报错。
class MultiDelegateShow { public void MultiDelegateExample() { //多播委托就是一个方法列表:+=在列表尾巴上加方法;-=就是从尾巴开始匹配, //只移除第一个完全吻合额方法,如果没有吻合,不报错。 OtherClass otherclass = new OtherClass(); Console.WriteLine("*****************************+=添加方法列表********************************"); Action del1 = new Action(this.SameClassMethod); //加入1. 同类中的方法 del1 += new OtherClass().OtherClassMethod; //加入 2. 不同类的实例方法 del1 += OtherClass.StaticMethod;//加入3.静态方法 del1 += () => Console.WriteLine("LambdaMethod is be calling"); //加入4.lambda表达式 del1 += otherclass.OtherClassMethod;//加入5. 注意和2的区别 del1.Invoke(); //程序会按照1,2,3,4调用方法 Console.WriteLine("*****************************-=删除方法列表********************************"); del1 -= this.SameClassMethod; //从尾巴开始查找(4,3,2,1),匹配到删除 del1 -= OtherClass.StaticMethod; // 静态方法删除 del1-= new OtherClass().OtherClassMethod;//这里删除不了,因为是不同实例的方法 del1 -= () => Console.WriteLine("LambdaMethod is be calling");//Lambda方法是无法移除的 del1 -= otherclass.OtherClassMethod;//这是同一个实例方法,被移除 del1.Invoke(); Console.WriteLine("***************************带有返回值的多播委托******************************"); Func<string> del2 = new Func<string>(otherclass.WithReturnMethod); del2 += () => "1"; del2 += () => "2"; del2 += () => "3"; del2 += () => "4"; Console.WriteLine(del2.Invoke()); //带返回值的多播委托,只能获得最后一个方法的返回值 Console.WriteLine("*****************************多播委托的异步调用********************************"); //del1.BeginInvoke(null, null); 多播委托不能直接异步调用 foreach (Action item in del1.GetInvocationList()) //这里相当于为每一个委托开一个线程 { item.BeginInvoke(null, null); } } private void SameClassMethod() { Console.WriteLine(" SameClassMethod is be calling"); } } class OtherClass { public void OtherClassMethod() { Console.WriteLine("OtherClassMethod is be calling"); } public static void StaticMethod() { Console.WriteLine("StaticMethod is be calling"); } public string WithReturnMethod() { return string.Format("This is a method with a string return"); } }
2. 委托的意义:解耦
异步多线程
多播委托
3. 事件
事件就是委托的实例,加了一个Event关键字
委托是一种类型,事件是委托的实例
加Event关键字后,控制了权限,不让外部调用或直接赋值
class Program { static void Main(string[] args) { Console.WriteLine("*****************************EventShow********************************"); EventShow eventshow = new EventShow() ; //Action catdelegate = Dog.Run; 委托可以直接赋值 //catdelegate.Invoke(); 委托可以直接调用 //catdelegate = null; 委托可以赋值null //eventshow.catEventhandle = Dog.Run; 事件不可以直接赋值 //eventshow .catEventhandle.Invoke(); 事件不让外部直接调用 //事件控制了权限,事件只能出现在+=,-=的左边 eventshow.catEventhandle += Dog.Run; eventshow.catEventhandle += Baby.Cry; eventshow.catEventhandle += Father.Turn; eventshow.catEventhandle += Mother.Hug; eventshow.CatMiao(); Console.ReadKey(); }
class EventShow { public event Action catEventhandle=null; public void CatMiao() { Console.WriteLine("cat Miao"); if(catEventhandle!=null) { catEventhandle.Invoke(); } } }
class Dog { public static void Run() { Console.WriteLine("Dog Run"); } }