国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

【C#】委托

2019-11-14 16:30:10
字體:
供稿:網(wǎng)友

 

一、委托的基本的寫法

  internal class PRogram    {        private static void Main(string[] args)        {            ChainDelegate();            Console.ReadKey();        }        public static void ChainDelegate()        {            //創(chuàng)建委托            Feedback feedbackToConsole = new Feedback(FeedbackToConsole);            Feedback feedbackToMsBox = new Feedback(FeedbackToMsBox);                        //單個委托            feedbackToConsole(1);            feedbackToMsBox(2);            //委托鏈            Feedback fbChain = null;            fbChain += feedbackToConsole;            fbChain += feedbackToMsBox;            fbChain(3);        }        public static void FeedbackToConsole(Int32 value)        {            Console.WriteLine(string.Concat("FeedbackToConsole->", value));        }        public static void FeedbackToMsBox(Int32 value)        {            Console.WriteLine(string.Concat("FeedbackToMsBox->", value));        }    }    //定義一個委托    internal delegate void Feedback(Int32 value);
View Code

 知識點:

  1.定義delegate:delegate void Feedbakc(Int32 value)

    • delegate是關鍵字
    • void返回值(這里可以定義各種返回值,包括泛型)
    • Int32 value定義了輸入的參數(shù)             

  2.定義回調(diào)函數(shù)FeedbackToConsole, FeedbackToMsBox

    • 回調(diào)的函數(shù)的輸入?yún)?shù)類型和個數(shù)要和定義的委托完全一樣
    • 返回值是引用類型要遵守協(xié)變和逆變(這里可以看我轉(zhuǎn)載的泛型3),值類型不用遵守遵守協(xié)變和逆變。

  3.創(chuàng)建委托 var feedbackToConsole=new Feedback(FeedbackToConsole)

    • 用new關鍵字來創(chuàng)建委托
    • 參數(shù)是你的回調(diào)函數(shù)(要求看第2點)

  4.調(diào)用委托

      feedbackToConsole(1)

      feedbackToConsole.Invoke(1)

    • 當創(chuàng)建好委托以后,所對應對象名(feedbackToConsole)就相當于委托的函數(shù)(FeedbackToConsole)。

  5.委托鏈

     Feed fbChain=null;
     fbChain+=feedbackToConsole;      fbChain=(Feedback)Delegate.Combine(fbChain,feedbackToConsole);
              fbChain+=feedbackToMsBox;
        fbChain=(Feedback)Delegate.Combine(fbChain,feedbackToMsBox);   

    • 有兩種寫法都列出來了,我喜歡第一種,比較簡單和直接。
    • 委托鏈的調(diào)用和調(diào)用單個一樣 fbChain(3)
    • 委托鏈的調(diào)用循序和綁定上去的循序一致(這里先調(diào)用feedbackToConsole,再調(diào)用feedbackToMsBox) 

    6.移除委托鏈中的數(shù)據(jù)(補充)
       fbChain -= feedbackToConsole         fbChain=(Feedback)Delegate.Remove(fbChain,feedbackToConsole);  

  • 二、委托和Lamda表達式   

         Feedback fd1 = new Feedback(i =>            {                Console.WriteLine(i);            });

    我們這樣用Lamda表達式直接代替了回調(diào)函數(shù),如果回調(diào)函數(shù)不是多個地方使用的話,我個人是比較喜歡這樣的寫法,而且我會寫成:

     Feedback fd1 = new Feedback(Console.WriteLine);

    這塊需要大家對Lamda表達式有一定的理解。

  • 三、泛型委托

  •  1.泛型委托和泛型接口一樣,是有協(xié)變和逆變的(這里可以看我轉(zhuǎn)載的泛型3)
     2.泛型委托我們自己一般是不需要去創(chuàng)建的,因為C#自己提供了兩種:
          Action<T,......> :只帶有輸入?yún)?shù)的泛型委托(有N個重載)
              Func<in TInput,......out TOutput> : 帶輸入?yún)?shù)和返回值的泛型委托(有N個重載)

     3.關于EvenHandler<T>可以看一下【C#】事件

       

  •            


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 如东县| 泰来县| 青州市| 庆云县| 淳化县| 彭山县| 越西县| 许昌市| 灵台县| 宜宾县| 渭南市| 都安| 桐庐县| 宽甸| 万安县| 芦山县| 金华市| 静安区| 河西区| 桐庐县| 富平县| 广昌县| 甘孜县| 交口县| 成武县| 泰和县| 巴楚县| 进贤县| 鄂温| 突泉县| 越西县| 年辖:市辖区| 尚志市| 常熟市| 邓州市| 嘉义市| 商丘市| 栾城县| 淅川县| 名山县| 隆昌县|