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

淺談C#委托和事件

編輯:C#入門知識

委托給了C#操作函數的靈活性,我們可使用委托像操作變量一樣來操作函數,其實這個功能並不是C#的首創,早在C++時代就有函數指針這一說法,而在我看來委托就是C#的函數指針,首先先簡要的介紹一下委托的基本知識:

委托的定義
委托的聲明原型是
delegate <函數返回類型> <委托名> (<函數參數>)
例子:public delegate void CheckDelegate(int number);//定義了一個委托CheckDelegate,它可以注冊返回void類型且有一個int作為參數的函數
這樣就定義了一個委托,但是委托在.net內相當於聲明了一個類(在後面的代碼中會講到確實如此),類如果不實例化為對象,很多功能是沒有辦法使用的,委托也是如此.

委托的實例化
委托實例化的原型是
<委托類型> <實例化名>=new <委托類型>(<注冊函數>)
例子:CheckDelegate _checkDelegate=new CheckDelegate(CheckMod);//用函數CheckMod實例化上面的CheckDelegate 委托為_checkDelegate
在.net 2.0開始可以直接用匹配的函數實例化委托:
<委托類型> <實例化名>=<注冊函數>
例子:CheckDelegate _checkDelegate=CheckMod;//用函數CheckMod實例化上面的CheckDelegate 委托為_checkDelegate
現在我們就可以像使用函數一樣來使用委托了,在上面的例子中現在執行_checkDelegate()就等同於執行CheckMod(),最關鍵的是現在函數CheckMod相當於放在了變量當中,它可以傳遞給其它的CheckDelegate引用對象,而且可以作為函數參數傳遞到其他函數內,也可以作為函數的返回類型

委托的多播性
在上面實例化委托的時候看到:必須將一個匹配函數注冊到委托上來實例化一個委托對象,但是一個實例化委托不僅可以注冊一個函數還可以注冊多個函數,注冊多個函數後,在執行委托的時候會根據注冊函數的注冊先後順序依次執行每一個注冊函數
函數注冊委托的原型:
<委托類型> <實例化名>+=new <委托類型>(<注冊函數>)
例子:CheckDelegate _checkDelegate=new CheckDelegate(CheckMod);//將函數CheckMod注冊到委托實例_checkDelegate
在.net 2.0開始可以直接將匹配的函數注冊到實例化委托:
<委托類型> <實例化名>+=<注冊函數>
例子:CheckDelegate _checkDelegate+=CheckMod;//將函數CheckMod注冊到委托實例_checkDelegate
之後我們還可以注冊多個函數到委托上:
例子:_checkDelegate+=CheckPositive;//將函數CheckPositive注冊到委托實例_checkDelegate
        _checkDelegate();//執行這個委托實例會先執行CheckMod()再執行CheckPositive()

實際上使用+=符號的時候會判斷
如果此時委托還沒有實例化(委托實例為null),它會自動用+=右邊的函數實例化委托
如果此時委托已經實例化,它會只把+=右邊的函數注冊到委托實例上
另外有一點需要注意的是,如果對注冊了函數的委托實例從新使用=號賦值,相當於是重新實例化了委托,之前在上面注冊的函數和委托實例之間也不再產生任何關系,後面的例子會講到這點!

當然有+=注冊函數到委托,也有-=解除注冊
例子:_checkDelegate-=new CheckDelegate(CheckPositive);//解除CheckPositive對_checkDelegate的注冊
        _checkDelegate-=CheckPositive;//.net 2.0開始可以用這種方式解除注冊

c#事件
了解委托之後,就可以來談談事件了,C#事件是什麼?
<

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