淺談通過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的訂閱模式模式
- 通過釋出訂閱模式實現的事件委託模式事件
- 淺談閱讀
- SQLServer 2012複製訂閱資料訂閱過程SQLServer
- 手寫事件釋出訂閱框架事件框架
- 淺談 iOS 事件的傳遞和響應過程iOS事件
- 從釋出-訂閱模式談談 Flask 的 Signals模式Flask
- 03_元件、事件、插槽、釋出訂閱元件事件
- 淺談觀察者模式和釋出訂閱者模式的微妙區別模式
- Delegate 運算子深入淺出
- 結合 Vue 原始碼談談釋出-訂閱模式Vue原始碼模式
- 談談觀察者模式和釋出訂閱模式模式
- Laravel 後臺與爬蟲互動-通過 Redis 的頻道訂閱來通訊Laravel爬蟲Redis
- 詳談:Redis事務和訊息訂閱Redis
- 淺談JS事件機制與React事件機制JS事件React
- 睿象雲高科|淺談事件管理事件
- javascript訂閱模式淺析和基礎例項JavaScript模式
- 企圖為vuex新增發布訂閱:事件繫結和事件觸發Vue事件
- 一文讀懂Guava EventBus(訂閱\釋出事件)Guava事件
- 淺談js的事件迴圈(Event Loop)JS事件OOP
- 淺談Android 事件分發機制(二)Android事件
- 五年之後超過10000訂閱者
- 淺談布隆過濾器過濾器
- 淺談利用session繞過getshellSession
- 淺談Flutter熱過載(上)Flutter
- 淺談Android中的事件分發機制Android事件
- 淺談Node.js的事件環(event loop)Node.js事件OOP
- openGauss 訂閱
- Java MQTT訂閱端,可訂閱萬用字元(/#)JavaMQQT字元
- 重學c#系列——訂閱釋出與事件[二十六]C#事件
- Blazor+Dapr+K8s微服務之事件釋出訂閱BlazorK8S微服務事件
- SQL疑難雜症【2】解決SQL訂閱過程中找不到已經建立的訂閱SQL
- .NET進階篇02-Delegate委託、Event事件事件
- 12 號開始,無法通過 https://gocn.vip/feed 訂閱 Go 每日新聞了HTTPGo
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- 淺談IAT加密原理及過程加密
- 通過三款遊戲,淺談遊戲BOSS戰的邏輯設計遊戲
- 小心訂閱模式模式
- 設計模式之委派模式(Delegate Pattern)深入淺出設計模式