C# 回調函數

C#回調函數應用示例,形象比喻方法助理解,整理了一個簡單的例子來說明回調函數的用法: 
namespace CallBackFunction
 
{
 
    class Program
 
    {
 
        static void Main(string[] args)
 
        {
 
            Program prog = new Program();//
在靜態函數Main中調用非靜態方法時,必須先實例化該類對象,方可調用GetSum方法 
            SumClass sc = new SumClass();//
實例化SumClass 
            int result=sc.SumAll(prog.GetSum);
 
            Console.WriteLine(result.ToString());
 
        }

        private int GetSum(int a, int b) 
        {
 
            return (a + b);
 
        }
 
    }

    class SumClass 
    {
 
        public delegate int Sum(int num1, int num2);
 
        public int SumAll(Sum sum)
 
        {
 
            //
可以進行些別的操作 
            return sum(1, 2);//
調用傳入函數的一個引用 
        }
 
        //
可以封裝更多的業務邏輯方法 
    }
 
}
 
這個例子非常的簡單,假設SumClass類是一個被封裝好的,實現某種業務邏輯的類. 

其中包含一個委託(delegate)Sum返回值爲int,有兩個int型的參數. 

還包括一個返回值爲int方法SumAll,注意這個方法的參數,Sum類型的參數,也可以理解爲是一個函數的引用(這個函數就是回調函數).作爲參數的sum,可以說是某個函數的引用,這個函數返回值爲int,並提供兩個整型參數.現在大概可以理解了吧?所謂委託可以被看作是一組方法簽名相同的函數的引用的"",其每一個實例都是符合該方法簽名的函數的一個引用.在該方法中可以進行一些操作,並調用傳進來的函數引用(sum),而此時sum這個方法內的具體業務邏輯是怎樣的並不清楚,SumClass就充當了一個接口的作用,這時接口就需要調用SumClass類的客戶端來通過定義一個"回調函數"來實現其具體功能了.

 

再看Program,這個類其實就是調用SumClass這個類的一個"客戶端". 

先來看GetSum這個方法,返回值爲int,接受兩個int型的參數...如果前面說的你都明白了,那麼你一定很清楚GetSum就是作爲客戶端的"回調函數"用來作爲參數的.這個函數實現了兩個參數是相加並返回其和的業務邏輯

Main函數中,調用SubClass類的SubAll方法,Programe類的GetSum方法的引用作爲參數傳遞到SubAll方法中,也就是在SubAll中調用GetSum這個相加兩個參數的方法,12相加返回3,並將result(3)輸出到屏幕上

通常情況下SubClass類會被封裝到DLL,而參數類型即爲一個委託,傳入此委託的一個實例(回調函數)來幫助SubClass實現其業務邏輯
最後再舉一個生活中的例子幫助大家來理解

一天你老婆讓你去市場買菜,而你因爲偷懶就讓你的兒子去買,把菜買回來了你直接將菜交給老婆.而老婆只是想要菜,並不關心菜是誰買的.第二天你老婆讓你去買米,結果你又交由兒子處理.第三天老婆讓去買肉,可憐的兒子再次被你叫去了... 
從這些事情我們可以抽象出一個類來

這個類就是實現不管老婆讓你去做什麼,你都叫兒子去代勞.那麼我們就可以定義一個"讓兒子去做"這樣的委託.然後傳入"買菜","買肉"等函數進來,這些函數就是回調函數.這樣不論老婆需要"買菜","買肉"或者其他任何的事情,都可以通過你這個類來完成.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章