ASP.Net 之委託事件

     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 beijingorm

     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();
        }
相關文章
相關標籤/搜索