總結:C# 委託的全面理解

來源:互聯網
上載者:User

標籤:

在說事件之前得先瞭解委託。
委託,外表看來和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);
            }
        }
編寫函數,大寫、小寫、加引號
進一步體會:和直接調用函數的區別:用委託就可以指向任意的函數,哪怕是之前沒定義的都可以,而不使用受限於那幾種。

總結: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.