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