1.首先給一張圖讓你們瞭解什麼是委託?它的優缺點是什麼? 程序員
2.經過代碼的運用更深刻地瞭解委託事件(窗體應用程序)數組
1)下面咱們先定義一個無參數的委託。 spa
//1.0 定義一個自定義的委託,此委託的簽名是,無返回值void 無參數 public delegate void DmyFirstHander();
2)在須要使用委託的方法塊中調用委託。.net
//1.0 定義一個委託對象,載入實例方法 DmyFirstHander d = new DmyFirstHander(SayHelloCH); //2.0 向委託對象d追加一個方法,+=:實際上是給程序員開發方便而產生的語法糖,最終編譯器會將語法糖編譯成真正的.net代碼 //Delegate.Combine() d += Form1.SayHelloEN; d -= SayHelloCH; //缺點:形成委託對象不可控 d = null; //調用委託,d.Invoke(); d();
委託對象載入的實例方法是code
void SayHelloCH() { MessageBox.Show("你好呀,小北京"); } static void SayHelloEN() { MessageBox.Show("Hello beijing"); }
3)而後就會獲得提示框輸出「Hello beijing」orm
3.下面給一張圖讓你們瞭解委託操做代碼的本質。對象
4.一些委託的擴展知識:blog
1)利用GetInvocationList()獲取當前委託對象中的全部方法的單個委託排序
//利用GetInvocationList()獲取當前委託對象中的全部方法的單個委託 Delegate[] darr = d2.GetInvocationList();
2) 遍歷全部方法的委託事件
List<string> reslist = new List<string>(); //遍歷全部方法的委託 foreach (Delegate item in darr) { //執行方法委託講返回結構加入到List<>集合中 reslist.Add((item as DmySecHander).Invoke(100)); //DmySecHander dsH = item as DmySecHander; //dsH(100); }
3)經過string.Join以換行的方式將集合中的全部數據輸出到變量res
string res = string.Join("\r\n", reslist);
4)利用自定義委託處理字符串
public delegate string DProcessString(string str); private void button3_Click(object sender, EventArgs e) { string str = "Hello"; //1.0 對字符串進行轉大寫處理 MessageBox.Show(ProcessString(str, toupperstr)); //2.0 對str字符串追加一個! MessageBox.Show(ProcessString(str, AddStr)); } string ProcessString(string str, DProcessString dprocessor) { str += "???????"; return dprocessor.Invoke(str); }
string AddStr(string str)
{
return str + "!";
}
string tolowerstr(string str)
{
return str.ToLower();
}
string toupperstr(string str)
{
return str.ToUpper();
}
5)利用系統委託進行排序
private void button4_Click(object sender, EventArgs e) { //對整數進行排序 //int[] arr = { 1, 2, 5, 0 }; //List<int> list = arr.ToList(); ////對list集合進行倒序排列 //list.Sort(Comp); //MessageBox.Show(string.Join("\n\r", list)); //2.0 對一個字符串進行排序 List<string> slist = new List<string>() { "a", "ab", "abc" }; slist.Sort(Compstring); MessageBox.Show(string.Join("\n\r", slist)); } /// <summary> /// 負責處理倒序邏輯 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> int Comp(int x, int y) { return y - x; } int Compstring(string x, string y) { return y.Length - x.Length; }
6)獲取數組最大值
public delegate bool DmyComp(object x, object y); private void button5_Click(object sender, EventArgs e) { #region 3.0.1 獲取數組最大值(整數) //object[] intArr = { 1, 0, 3, 2, 4 }; //object maxobj = GetMax(intArr, intComp); //MessageBox.Show(maxobj.ToString()); #endregion #region 3.0.2獲取pig對象數組的年齡最大的pig對象 object[] arrPig = { new Pig(){ Name="八戒", Age=500}, new Pig(){ Name="小豬", Age=1}, new Pig(){ Name="野豬", Age=4} }; object pig = GetMax(arrPig, PigComaByAge); Pig maxPig = pig as Pig; MessageBox.Show("Name" + maxPig.Name + " age=" + maxPig.Age); #endregion } bool PigComaByAge(object p1, object p2) { Pig pig1 = p1 as Pig; Pig pig2 = p2 as Pig; return pig1.Age - pig2.Age > 0; } /// <summary> /// 負責比較兩個整數的大小 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> bool intComp(object x, object y) { return (int)x - (int)y > 0; } object GetMax(object[] arr, DmyComp comp) { //1.0 假設arr數組0下標的值就是最大 object max = arr[0]; //2.0 比較當前數組中的全部數據是否要大於max,若是大於則替換max的值 for (int i = 1; i < arr.Length; i++) { //判斷若是大於則替換max的值 if (comp(arr[i], max)) { max = arr[i]; } } return max; }
7)利用事件向委託註冊方法,並調用
/// <summary> /// 負責定義事件 /// </summary> public class DelegateHelper { public static event DmyFirstHander OnFirstHander; // public static event DmySecHander OnSecHander; /// <summary> /// 負責觸發事件方法 /// </summary> public static void Run() { if (OnFirstHander != null) { //執行事件 OnFirstHander(); //本質: OnFirstHander.Invoke(); } }
/* 利用事件的優勢: * 一、對委託進行了封裝,只容許程序員進行 +=,和 -=操做,不容許進行直接賦值 * 二、通常是定義在類中,語法:public event DmyFirstHander myFirstHander; 三、利用事件操做委託,底層 一、拆成了一個私有的靜態的委託變量 二、經過add_xx() ,remove_xxx()向私有的靜態的委託變量 加方法和移除方法 */ private void button6_Click(object sender, EventArgs e) { //註冊一個sayHelloCH //事件的+=本質:add_OnFirstHander() DelegateHelper.OnFirstHander += SayHelloCH; //報錯:事件只能出如今+=,-=的左邊,而此處出如今了=的左邊 //DelegateHelper.OnFirstHander = null; DelegateHelper.OnFirstHander += Form1.SayHelloEN; //事件的+=本質:remove_OnFirstHander() DelegateHelper.OnFirstHander -= SayHelloCH; //觸發事件 DelegateHelper.Run(); }