日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#回调函数的简单讲解与应用例子

發(fā)布時間:2024/1/23 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#回调函数的简单讲解与应用例子 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載地址:https://blog.csdn.net/sajiazaici/article/details/78702144

本博客一直以來的宗旨就是:用最簡單的方式講清楚不復(fù)雜的問題。

因?yàn)楸救艘埠懿怂砸矝]法講太復(fù)雜HHHHHH…

所以如果哪天某個大神看到了覺得講的有問題歡迎指出。

話不多說進(jìn)入正題。。

——————————————————————————————————————

這篇文章的目的就是講清楚C#回調(diào)函數(shù)是什么,以及什么時候使用。

直接拿例子來講算了- -

using System;

namespace CallBackTest
{
class Program //用戶層,執(zhí)行輸入等操作
{
static void Main(string[] args)
{

CalculateClass cc = new CalculateClass();FunctionClass fc = new FunctionClass();int result1 = cc.PrintAndCalculate(2, 3, fc.GetSum);Console.WriteLine("調(diào)用了開發(fā)人員的加法函數(shù),處理后返回結(jié)果:" + result1);int result2 = cc.PrintAndCalculate(2, 3, fc.GetMulti);Console.WriteLine("調(diào)用了開發(fā)人員的乘法函數(shù),處理后返回結(jié)果:" + result2);Console.ReadKey();}}class FunctionClass //開發(fā)層處理,開發(fā)人員編寫具體的計算方法 {public int GetSum(int a, int b){return (a + b);}public int GetMulti(int a, int b){return (a * b);} }#region 實(shí)際開發(fā)中,下面這個類會封裝起來,只提供函數(shù)接口。相當(dāng)于系統(tǒng)底層 class CalculateClass {public delegate int SomeCalculateWay(int num1, int num2);//將傳入?yún)?shù)在系統(tǒng)底層進(jìn)行某種處理,具體計算方法由開發(fā)者開發(fā),函數(shù)僅提供執(zhí)行計算方法后的返回值public int PrintAndCalculate(int num1 , int num2 , SomeCalculateWay cal) {Console.WriteLine("系統(tǒng)底層處理:" + num1);Console.WriteLine("系統(tǒng)底層處理:" + num2);return cal(num1, num2);//調(diào)用傳入函數(shù)的一個引用 }//可以封裝更多的業(yè)務(wù)邏輯方法 } #endregion

}
直接復(fù)制進(jìn)控制臺項(xiàng)目即可運(yùn)行。

運(yùn)行結(jié)果:

感覺例子還是比較直白的。例子能看懂就不用看下面的了。

下面詳細(xì)解釋一下(包含一些關(guān)于封裝的意義):

1、中間的FunctionClass中的GetSum()和GetMulti()兩個函數(shù)稱為回調(diào)函數(shù)。可以看到整個程序中并沒有哪個地方通過類似GetSum(1,2)這種形式調(diào)用了該函數(shù),只有將其當(dāng)作另一個函數(shù)的參數(shù)來進(jìn)行調(diào)用。如cc.PrintAndCalculate(2, 3, fc.GetSum)。

下面是百度百科的定義:

回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。

簡單來說,就是 public delegate int SomeCalculateWay(int num1, int num2) 這行代碼,把 SomeCalculateWay 這幾個字符定義成一種類型,什么類型呢?-> 帶了兩個int參數(shù)的函數(shù)類型。而PrintAndCalculate()函數(shù)的第三個參數(shù)是這種類型,GetSum(int,int)也是這種類型,所以GetSum這個函數(shù)可以被當(dāng)做參數(shù)傳入,并且在打印完兩個數(shù)字后執(zhí)行,被稱為回調(diào)函數(shù)。

自此代碼部分解釋完畢

有的同學(xué)可能會問了,那為什么不直接寫int result1 = GetSum(1,2)呢?豈不是更方便?用這個回調(diào)函數(shù)意義在哪呢?

這就涉及到封裝和實(shí)際開發(fā)的問題了 ↓


我們假想一下這個情況:

我們的項(xiàng)目是個核武器控制器,假設(shè)并沒有涉及到回調(diào)函數(shù)。當(dāng)用戶輸入1,2并且執(zhí)行GetSum(1,2)的時候,這個工程會把1,2寫進(jìn)核武器的發(fā)射系數(shù)里,比如方向方位等,然后GetSum求得發(fā)射距離,之后進(jìn)行發(fā)射。

看起來也很完美?沒什么瑕疵?

不,有沒有想過萬一哪天操作失誤了呢。萬一哪天某個人輸入錯了,把-1,-2輸入進(jìn)去了,現(xiàn)在倒好,本來要打到外面去的導(dǎo)彈打到自己家了,這個損失就是不可估量的了。

你可能又會說了,那讓程序員在客戶端(用戶端)判斷一下唄,比如加一句 if(a>0 && b>0) getsum(a,b);

那你有沒想過,萬一哪天這個程序員的代碼寫錯了一行呢?或者派了一個像我一樣很菜的實(shí)習(xí)生過來寫代碼?豈不是又要把導(dǎo)彈打到自己家了嗎hhhhhhhh。所以,在實(shí)際大型應(yīng)用中,“把參數(shù)寫進(jìn)核武器” 這個操作的代碼并不是所有人都能接觸到的,只有項(xiàng)目里最核心的工程師經(jīng)過反復(fù)測驗(yàn)才能應(yīng)用上去的,而且要對這些參數(shù)甚至是結(jié)果進(jìn)行必要的判斷,并且如果要修改代碼也是會經(jīng)過慎重考量的,因?yàn)槟阋桓?#xff0c;相當(dāng)于整個項(xiàng)目底層都進(jìn)行了改變,所有調(diào)用你函數(shù)的人執(zhí)行效果也都會發(fā)生改變。

以上就是封裝的意義。(當(dāng)然封裝還有其他意義這里就不贅述了)


2、在實(shí)際開發(fā)中,CalculateClass這個類會被封裝起來,比如提供一個dll文件給你,你通過引用dll來調(diào)用里面的參數(shù)或者函數(shù)。一般項(xiàng)目里的大佬/主程都會把這些底層的東西打包進(jìn)dll,防止誤操作使得系統(tǒng)崩潰,也讓外界不能輕易訪問底層的東西。

在這個類中,public delegate int SomeCalculateWay(int num1, int num2); 這一語句聲明了一個委托,后面定義的SomeCalculateWay cal就代表著cal是一個帶有兩個int參數(shù)的函數(shù)。關(guān)于委托的例子和應(yīng)用這里也不多講了,能理解就好。

3、在用戶層的main函數(shù)里,用戶可以通過輸入?yún)?shù)2,3,然后獲取一個開發(fā)人員的方法比如getsum,然后把這些作為參數(shù),調(diào)用底層的函數(shù),再得到想要的效果。這樣子不管是用戶還是開發(fā)人員誤操作了,最后都會被底層的函數(shù)給判斷出來,從而不會執(zhí)行錯誤的結(jié)果而造成損失。

4、當(dāng)然封裝是回調(diào)函數(shù)的一種用法,還有一種用法就是在有網(wǎng)絡(luò)延遲的情況下,可以告訴外界某段代碼已經(jīng)在一定延遲后執(zhí)行完畢,此時回調(diào)函數(shù)就作為執(zhí)行后接下來要進(jìn)行的操作,更詳細(xì)的用法后續(xù)再進(jìn)行說明。

說了這么多,感覺講的還是挺清楚的,適合新手看看。。

如果哪里有錯誤也希望大家指出,謝謝。。


JosieBook的糾正:
FunctionClass類中的GetSum()和GetMulti()函數(shù)是封裝的底層函數(shù)。通過CalculateClass類中的函數(shù)調(diào)用封裝的回調(diào)函數(shù)。

轉(zhuǎn)載文里面應(yīng)該是弄反了,這里可能需要注意一下。。。

總結(jié)

以上是生活随笔為你收集整理的C#回调函数的简单讲解与应用例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。