.net学习之委托和事件
1.什么是委托
通俗的說:委托就是一個能夠存儲符合某種格式(方法簽名)的方法的指針的容器
上傳圖片:
2.委托語法
準備一個方法:string Hello(string userName){}
string Hello2(string userName){}
聲明委托類:delegate string DGSayHi(string userName);
創建委托對象:DGSayHi dgSay = new DGSayHi(Hello);
或 DGSsyHi dgSay = Hello;
追加方法:dgSay+=Hello2;
刪除方法:dgSay -=Hello2;
調用委托:dgSay("你好");
3.多播委托
通常將包含多個方法指針的委托叫做多播委托
其實每個用戶定義的委托類型編譯后都是一個繼承于多播委托的類,看源碼:
上傳圖片:
4.委托的目的
(1)能將方法作為參數和返回值傳遞
(2)調用一個委托,執行N個方法(多播委托)
5.委托的缺點
不進行控制的缺點:可以使用Click=null來清除所有注冊的事件,可以用Click()來假冒事件的觸發。
解決方案,把委托成員做成private的,然后增加AddClickEventHandler、RemoveClickEventHandler兩個public方法
6.什么是事件
對委托變量的可訪問性進行控制封裝
語法:public delegate void DGSayHi(string name);
public event DGSayHi dgSay;//創建事件委托(本質還是委托對象)
event會自動生成一個private delegate變量和兩個函數: add和remove,C#編譯器用這兩個方法支持+=和-=操作符
?
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApplication1 {public delegate void DGEach(int index,object item);public delegate void DGTest();internal class Program{public static void Test1(DGTest dgTest){dgTest(); //編譯后:dgTest.Invoke();Console.WriteLine("Test1");}public static void Test2(){Console.WriteLine("Test2");}public static void Test3(){Console.WriteLine("Test3");}/// <summary>/// 委托當返回值/// </summary>/// <param name="strType"></param>/// <returns></returns>public static DGTest InvokeTest(string strType){switch (strType){case "2":return Test2;case "3":return Test3;default:return Test3;}}/// <summary>/// 使用委托模仿jQuery each方法/// </summary>/// <param name="list"></param>/// <param name="func"></param>public static void Each(ArrayList list, DGEach func){for (int i = 0; i < list.Count; i++){func(i, list[i]);}}private static void Main(string[] args){#region 委托當參數//DGTest dgTest = new DGTest(Test2);//或者 DGTest dgTest = Test2;//Test1(dgTest);#endregion#region 委托當返回值//DGTest dgTest = InvokeTest("2");//dgTest();#endregion#region 完成 Each方法//ArrayList list = new ArrayList();//list.Add("劉德華");//list.Add("張學友");//list.Add("郭富城");//list.Add("黎明");// Each(list, delegate(int index,object item)// {// Console.WriteLine(index+"---------"+item.ToString());// });#endregion#region 事件練習,一個設計模式的題目,說有三個對象,貓,老鼠,人,貓看見了老鼠,老鼠嚇跑了,在過程中把人吵醒, 在編程過程中注意新的對象的參與Cat c = new Cat();c.Name = "tom";c.DGRunEventHandler += c_DGRunEventHandler;c.SeeMouse(c.Name);#endregion}private static void c_DGRunEventHandler(object sender,EventArgs e){Mouse m = new Mouse();m.Name = "mouse1";m.DGRunEventHandler += m_DGRunEventHandler;m.MouseRun(m);}private static void m_DGRunEventHandler(object sender, EventArgs e){Person p = new Person();p.WakeUp(sender);}}public class Cat{public event EventHandler DGRunEventHandler;public void SeeMouse(string name){Console.WriteLine(name+"看見老鼠");if (DGRunEventHandler != null){DGRunEventHandler(this,new EventArgs());}}public string Name { get; set; }}public class Person{public void WakeUp(object sender){Console.WriteLine((sender as Mouse).Name+"老鼠跑,人醒了");}public string Name { get; set; }}public class Mouse{public event EventHandler DGRunEventHandler;public void MouseRun(object sender){Console.WriteLine((sender as Mouse).Name+"老鼠跑");if (DGRunEventHandler != null){DGRunEventHandler(this, new EventArgs());}}public string Name { get; set; }} }?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的.net学习之委托和事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EasyUI 1.3.6 行号显示不全
- 下一篇: 斯坦福大学公开课:iPhone开发教程2