淺談通過delegate訂閱事件
委託和事件是C#語言一個新的術語,其實他們最初是起源於c/C++中的函式指標。
實現步驟:
1. 宣告一個delegate物件。
2. 實現和delegate具有相同引數和返回值的函式實現(可以是靜態和非靜態的)。
3. 產生一個delegate物件的時候,把你剛剛實現的函式作為引數傳給他的建構函式。
先看下面例子:
DAL類中:
public delegate void deleException(System.Exception exception);//宣告一個委託
public event deleException evenException;//定義一個委託型別事件
public void CallEvent(System.Exception exception)//觸發事件方法
{
deleException messageEvent = evenException;
if (messageEvent != null)
{
//通知所有已訂閱事件的物件(傳遞訊息)
messageEvent(exception);
}
}
///
/// 開啟與資料庫連線
///
///
public bool Open()
{
try
{
if (m_SqlCeConnection != null && m_SqlCeConnection.State == ConnectionState.Closed)
m_SqlCeConnection.Open();
return true;
}
catch (System.Exception e)
{
CallEvent(e);//觸發事件
return false;
}
}
Form1類中:
private void ShowMessage(Exception ex)//事件處理
{
MessageBox.Show(ex.Message);
}
DAL _dal = new DAL(……)……;
_dal.evenException += new deleException(ShowMessage);//偵聽事件
_dal.Open();//若Open()時產生異常,則呼叫ShowMessage();
在上面的例子中或許看不出有什麼好的,但在某些場合,就顯示很重要了。比如通過執行緒更新UI,因為執行緒直接更新UI是不安全的。
"委託"是"函式指標"連結串列,當然該連結串列也可以只有一個元素,如果這樣的話:"委託" 約等於 "函式指標";
"事件"是一類特特殊的"委託",你定義一個"事件",表示你同時定義了:一個委託+兩個方法。
實現步驟:
1. 宣告一個delegate物件。
2. 實現和delegate具有相同引數和返回值的函式實現(可以是靜態和非靜態的)。
3. 產生一個delegate物件的時候,把你剛剛實現的函式作為引數傳給他的建構函式。
先看下面例子:
DAL類中:
public delegate void deleException(System.Exception exception);//宣告一個委託
public event deleException evenException;//定義一個委託型別事件
public void CallEvent(System.Exception exception)//觸發事件方法
{
deleException messageEvent = evenException;
if (messageEvent != null)
{
//通知所有已訂閱事件的物件(傳遞訊息)
messageEvent(exception);
}
}
///
/// 開啟與資料庫連線
///
///
public bool Open()
{
try
{
if (m_SqlCeConnection != null && m_SqlCeConnection.State == ConnectionState.Closed)
m_SqlCeConnection.Open();
return true;
}
catch (System.Exception e)
{
CallEvent(e);//觸發事件
return false;
}
}
Form1類中:
private void ShowMessage(Exception ex)//事件處理
{
MessageBox.Show(ex.Message);
}
DAL _dal = new DAL(……)……;
_dal.evenException += new deleException(ShowMessage);//偵聽事件
_dal.Open();//若Open()時產生異常,則呼叫ShowMessage();
在上面的例子中或許看不出有什麼好的,但在某些場合,就顯示很重要了。比如通過執行緒更新UI,因為執行緒直接更新UI是不安全的。
"委託"是"函式指標"連結串列,當然該連結串列也可以只有一個元素,如果這樣的話:"委託" 約等於 "函式指標";
"事件"是一類特特殊的"委託",你定義一個"事件",表示你同時定義了:一個委託+兩個方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-544952/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺談graphql的訂閱模式模式
- 通過釋出訂閱模式實現的事件委託模式事件
- 淺談Jquery中的bind(),live(),delegate(),on()繫結事件方式jQuery事件
- 手寫事件釋出訂閱框架事件框架
- 淺談觀察者模式和釋出訂閱者模式的微妙區別模式
- 談談觀察者模式和釋出訂閱模式模式
- SQLServer 2012複製訂閱資料訂閱過程SQLServer
- 淺談 iOS 事件的傳遞和響應過程iOS事件
- 從釋出-訂閱模式談談 Flask 的 Signals模式Flask
- 結合 Vue 原始碼談談釋出-訂閱模式Vue原始碼模式
- (轉)採購訂單接收淺談
- Laravel 後臺與爬蟲互動-通過 Redis 的頻道訂閱來通訊Laravel爬蟲Redis
- 詳談:Redis事務和訊息訂閱Redis
- javascript訂閱模式淺析和基礎例項JavaScript模式
- EventBus原始碼分析(三):post方法釋出事件【獲取事件的所有訂閱者,反射呼叫訂閱者事件處理方法】(2.4版本)原始碼事件反射
- 淺談JS事件機制與React事件機制JS事件React
- 一文讀懂Guava EventBus(訂閱\釋出事件)Guava事件
- 企圖為vuex新增發布訂閱:事件繫結和事件觸發Vue事件
- 睿象雲高科|淺談事件管理事件
- 淺談自動過帳
- Java MQTT訂閱端,可訂閱萬用字元(/#)JavaMQQT字元
- 淺談js的事件迴圈(Event Loop)JS事件OOP
- 通過三款遊戲,淺談遊戲BOSS戰的邏輯設計遊戲
- SQL疑難雜症【2】解決SQL訂閱過程中找不到已經建立的訂閱SQL
- 小心訂閱模式模式
- Blazor+Dapr+K8s微服務之事件釋出訂閱BlazorK8S微服務事件
- 重學c#系列——訂閱釋出與事件[二十六]C#事件
- Spring Cloud Bus中的事件的訂閱與釋出(一)SpringCloud事件
- 基於DLNA實現iOS,Android投屏:訂閱事件通知iOSAndroid事件
- 淺談Flutter熱過載(上)Flutter
- 淺談利用session繞過getshellSession
- 淺談布隆過濾器過濾器
- 基於訂閱的服務通訊架構體系架構
- 淺談Node.js的事件環(event loop)Node.js事件OOP
- 淺談Android 事件分發機制(二)Android事件
- 談談通過軟考的感受,包括通過軟考的經驗薦
- 12 號開始,無法通過 https://gocn.vip/feed 訂閱 Go 每日新聞了HTTPGo
- 5分鐘通過一個例子理解觀察者模式和釋出訂閱模式的區別模式