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"); } }