程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 總結:C# 委托的全面理解,

總結:C# 委托的全面理解,

編輯:C#入門知識

總結:C# 委托的全面理解,


在說事件之前得先了解委托。
委托,外表看來和C/C++中函數指針沒什麼區別,但是本質上你才發現他其實就是個類!也就是說理解委托得從
這個兩個方面去理解(單從一個方面去理解感覺就怪怪的呵呵!)

理解委托:
什麼是委托?委托是c#中類型安全的,可以訂閱一個或多個具有相同簽名方法的函數指針。
聲明一個委托,相當於聲明了一個是函數指針類型,委托是一種類型,進一步說,他就是一個類!
他的目的就是,將方法可以作為其他方法的參數傳遞!進一步說,就是一個方法內部需要調用另一種方法
(及方法內部還有一個方法),且這個內部調用的方法存在多樣性。那麼最好的方法就是將內部的方法作為外
部的方法的參數數進行傳參~~

委托的形式:
    聲明委托的方式:delegate 返回值類型 委托類型名(參數)
比如delegate void deleProcess(string s);
注意這裡的除了前面的delegate,剩下部分和聲明一個函數一樣,但是deleProcess不是函數名,而是委托類型名!

委托的使用:
      委托是c#中,可以訂閱一個或多個具有相同簽名方法的函數指針。所以說委托的使用和函數指針的使用是差不多的。
把它想象成一個指針就知道怎麼用了~~但是委托又不能完全的看成一個函數指針(本質上是個類),這是因為委托考慮到更多的安全性,
它需要存儲特定方法的細節。所以,定義好委托後,還需要創建一個委托實例,才可以使用(以存儲特定方法的細節)!
假設有一個函數是:void SayHi(String s); 這個正好和delegate void deleProcess(string s);這個委托的簽名一致。
那麼我們開始使用委托:
deleProcess pro = new deleProcess(SayHi);//實例化一個委托,並且用SayHi方法初始化它。
deleProcess pro = SayHi;  //這是上面的簡寫形式,編譯器幫我們進行了new!看上去是直接與方法關聯(看起來有指針的感覺呵呵),其實還是通過委托!
注意SayHi以及pro都沒有帶“括號”的這是應為如果帶上括號就是方法的調用了。好了當委托指向方法成功之後。
pro(s)就和SayHi(s),達到同一個目的了。
最終的目的委托是為了方法作為方法的參數:
viod GreetPeople(string name, deleProcess pro)//這個GreetPeople方法,就利用了委托將方法作為參數了!
{
      pro(name);//pro用起來就和方法是一樣的~~
}
如此就可以把SayHi方法作為參數傳遞了:
GreetPeople(song,SayHi);
//摘抄自《C#高級編程》
委托的一個特征是它們的類型是安全的,可以確保被調用的方法簽名是正確的。
但有趣的是,它們不關心調用該方法的是什麼類型的對象,甚至不考慮該方法
是靜態方法,還是實例方法。
提示:
給定委托的實例可以表示任何類型的任何對象上的實例方法或靜態方法——只要方法
的簽名匹配於委托的簽名即可。
//-------------------------------------------------------------------------------------------------------------
//委托使用的例子~~
delegate string ProcessDelegate(string s);
static void ProcessIntArray(ProcessDelegate p)
        {
            string[] values = new string[] { "aB","Cd"};
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = p(values[i]);
            }
            Console.WriteLine("處理後");
            foreach (string s in values)
            {
                Console.WriteLine(s);
            }
        }
編寫函數,大寫、小寫、加引號
進一步體會:和直接調用函數的區別:用委托就可以指向任意的函數,哪怕是之前沒定義的都可以,而不使用受限於那幾種。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved