C#回调函数的简单讲解与应用例子
轉載地址:https://blog.csdn.net/sajiazaici/article/details/78702144
本博客一直以來的宗旨就是:用最簡單的方式講清楚不復雜的問題。
因為本人也很菜所以也沒法講太復雜HHHHHH…
所以如果哪天某個大神看到了覺得講的有問題歡迎指出。
話不多說進入正題。。
——————————————————————————————————————
這篇文章的目的就是講清楚C#回調函數是什么,以及什么時候使用。
直接拿例子來講算了- -
using System;
namespace CallBackTest
{
class Program //用戶層,執行輸入等操作
{
static void Main(string[] args)
{
}
直接復制進控制臺項目即可運行。
運行結果:
感覺例子還是比較直白的。例子能看懂就不用看下面的了。
下面詳細解釋一下(包含一些關于封裝的意義):
1、中間的FunctionClass中的GetSum()和GetMulti()兩個函數稱為回調函數。可以看到整個程序中并沒有哪個地方通過類似GetSum(1,2)這種形式調用了該函數,只有將其當作另一個函數的參數來進行調用。如cc.PrintAndCalculate(2, 3, fc.GetSum)。
下面是百度百科的定義:
回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。
簡單來說,就是 public delegate int SomeCalculateWay(int num1, int num2) 這行代碼,把 SomeCalculateWay 這幾個字符定義成一種類型,什么類型呢?-> 帶了兩個int參數的函數類型。而PrintAndCalculate()函數的第三個參數是這種類型,GetSum(int,int)也是這種類型,所以GetSum這個函數可以被當做參數傳入,并且在打印完兩個數字后執行,被稱為回調函數。
自此代碼部分解釋完畢
有的同學可能會問了,那為什么不直接寫int result1 = GetSum(1,2)呢?豈不是更方便?用這個回調函數意義在哪呢?
這就涉及到封裝和實際開發的問題了 ↓
我們假想一下這個情況:
我們的項目是個核武器控制器,假設并沒有涉及到回調函數。當用戶輸入1,2并且執行GetSum(1,2)的時候,這個工程會把1,2寫進核武器的發射系數里,比如方向方位等,然后GetSum求得發射距離,之后進行發射。
看起來也很完美?沒什么瑕疵?
不,有沒有想過萬一哪天操作失誤了呢。萬一哪天某個人輸入錯了,把-1,-2輸入進去了,現在倒好,本來要打到外面去的導彈打到自己家了,這個損失就是不可估量的了。
你可能又會說了,那讓程序員在客戶端(用戶端)判斷一下唄,比如加一句 if(a>0 && b>0) getsum(a,b);
那你有沒想過,萬一哪天這個程序員的代碼寫錯了一行呢?或者派了一個像我一樣很菜的實習生過來寫代碼?豈不是又要把導彈打到自己家了嗎hhhhhhhh。所以,在實際大型應用中,“把參數寫進核武器” 這個操作的代碼并不是所有人都能接觸到的,只有項目里最核心的工程師經過反復測驗才能應用上去的,而且要對這些參數甚至是結果進行必要的判斷,并且如果要修改代碼也是會經過慎重考量的,因為你一改,相當于整個項目底層都進行了改變,所有調用你函數的人執行效果也都會發生改變。
以上就是封裝的意義。(當然封裝還有其他意義這里就不贅述了)
2、在實際開發中,CalculateClass這個類會被封裝起來,比如提供一個dll文件給你,你通過引用dll來調用里面的參數或者函數。一般項目里的大佬/主程都會把這些底層的東西打包進dll,防止誤操作使得系統崩潰,也讓外界不能輕易訪問底層的東西。
在這個類中,public delegate int SomeCalculateWay(int num1, int num2); 這一語句聲明了一個委托,后面定義的SomeCalculateWay cal就代表著cal是一個帶有兩個int參數的函數。關于委托的例子和應用這里也不多講了,能理解就好。
3、在用戶層的main函數里,用戶可以通過輸入參數2,3,然后獲取一個開發人員的方法比如getsum,然后把這些作為參數,調用底層的函數,再得到想要的效果。這樣子不管是用戶還是開發人員誤操作了,最后都會被底層的函數給判斷出來,從而不會執行錯誤的結果而造成損失。
4、當然封裝是回調函數的一種用法,還有一種用法就是在有網絡延遲的情況下,可以告訴外界某段代碼已經在一定延遲后執行完畢,此時回調函數就作為執行后接下來要進行的操作,更詳細的用法后續再進行說明。
說了這么多,感覺講的還是挺清楚的,適合新手看看。。
如果哪里有錯誤也希望大家指出,謝謝。。
JosieBook的糾正:
FunctionClass類中的GetSum()和GetMulti()函數是封裝的底層函數。通過CalculateClass類中的函數調用封裝的回調函數。
轉載文里面應該是弄反了,這里可能需要注意一下。。。
總結
以上是生活随笔為你收集整理的C#回调函数的简单讲解与应用例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VB与C#代码转换在线工具,亲测好用
- 下一篇: C#自定义进度条