C#回呼函數的簡單講解與應用例子(最簡單講解,大神繞道)

來源:互聯網
上載者:User

標籤:實現   size   title   新手   gets   call   sum   用例   dash   

本部落格一直以來的宗旨就是:用最簡單的方式講清楚不複雜的問題。

因為本人也很菜所以也沒法講太複雜HHHHHH......

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

話不多說進入正題。。

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

這篇文章的目的就是講清楚C#回呼函數是什麼,以及什麼時候使用。

直接拿例子來講算了- -

 

  1. using System;
  2.  
  3. namespace CallBackTest
  4. {
  5. class Program //使用者層,執行輸入等操作
  6. {
  7. static void Main(string[] args)
  8. {
  9.  
  10. CalculateClass cc = new CalculateClass();
  11. FunctionClass fc = new FunctionClass();
  12.  
  13. int result1 = cc.PrintAndCalculate(2, 3, fc.GetSum);
  14. Console.WriteLine("調用了開發人員的加法函數,處理後返回結果:" + result1);
  15.  
  16. int result2 = cc.PrintAndCalculate(2, 3, fc.GetMulti);
  17. Console.WriteLine("調用了開發人員的乘法函數,處理後返回結果:" + result2);
  18.  
  19. Console.ReadKey();
  20. }
  21.  
  22.  
  23. }
  24.  
  25. class FunctionClass //開發層處理,開發人員編寫具體的計算方法
  26. {
  27. public int GetSum(int a, int b)
  28. {
  29. return (a + b);
  30. }
  31. public int GetMulti(int a, int b)
  32. {
  33. return (a * b);
  34. }
  35. }
  36.  
  37. #region 實際開發中,下面這個類會封裝起來,只提供函數介面。相當於系統底層
  38. class CalculateClass
  39. {
  40. public delegate int SomeCalculateWay(int num1, int num2);
  41.  
  42. //將傳入參數在系統底層進行某種處理,具體計算方法由開發人員開發,函數僅提供執行計算方法後的傳回值
  43. public int PrintAndCalculate(int num1 , int num2 , SomeCalculateWay cal)
  44. {
  45. Console.WriteLine("系統底層處理:" + num1);
  46. Console.WriteLine("系統底層處理:" + num2);
  47. return cal(num1, num2);//調用傳入函數的一個引用
  48. }
  49. //可以封裝更多的商務邏輯方法
  50.  
  51. }
  52. #endregion
  53.  
  54. }
直接複製進控制台項目即可運行。

運行結果:

 


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

 

下面詳細解釋一下(包含一些關於封裝的意義):

1、中間的FunctionClass中的GetSum()和GetMulti()兩個函數稱為回呼函數。可以看到整個程式中並沒有哪個地方通過類似GetSum(1,2)這種形式調用了該函數,只有將其當作另一個函數的參數來進行調用。如cc.PrintAndCalculate(2, 3, fc.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,然後把這些作為參數,調用底層的函數,再得到想要的效果。這樣子不管是使用者還是開發人員誤操作了,最後都會被底層的函數給判斷出來,從而不會執行錯誤的結果而造成損失。

 

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

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

C#回呼函數的簡單講解與應用例子(最簡單講解,大神繞道)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.