C#總結(二)事件Event 介紹總結
最近在總結一些基礎的東西,主要是學起來很難懂,但是在日常又有可能會經常用到的東西。前面介紹了 C# 的 AutoResetEvent的使用介紹, 這次介紹事件(event)。
事件(event),對於初學者來說,確實比較神秘,難懂。但是在日常程式設計過程中卻經常遇到。事件使用得當,會讓你的程式碼更加整潔,也能少些很多程式碼。
它擁有以下三要素:
1. 事件發行者:達到某些條件時激發事件的物件
2. 事件訂閱者:訂閱事件並對事件發生時進行處理的物件
3. 定義發行者和訂閱者關係,一個發行者可能會有多個訂閱者。
事件發行者和事件訂閱者透過委託(delegate) 來實現傳送方和接收方的事件觸發。
它擁有哪些好處:
在以往我們編寫訂閱這類程式中,往往採用等待機制,為了等待某件事情的發生,需要不斷地檢測事情什麼時候發生,而透過事件(event),可以大大簡化了這種過程:
1. 使用事件,可以很方便地確定程式執行順序。
2. 當事件驅動程式等待事件時,它不佔用很多資源。事件驅動程式與過程式程式最大的不同就在於,程式不再不停地檢查輸入裝置,而是待著不動,等待訊息的到來,每個輸入的訊息會被排進佇列,等待程式處理它。如果沒有訊息在等待,則程式會把控制交回給作業系統,以執行其他程式。
3. 事件簡化了程式設計。事件訂閱者只是簡單地將訊息傳送給事件發行者,由發行者的事件驅動程式確定事件的處理方法。不必知道程式的內部訂閱觸發機制,只是需要知道如何傳遞訊息即可。
1.委託允許直接透過委託去訪問相應的處理函式,而事件只能透過公佈的回撥函式去呼叫,
2.事件只能透過“+=”,“-=”方式註冊和取消訂戶處理函式,而委託除此之外還可以使用“=”直接賦值處理函式。
在類的內部宣告事件,首先必須宣告該事件的委託型別。例如:
public delegate void NumManipulationHandler(NumEventArgs e);
然後,宣告事件本身,使用 event 關鍵字:
// 基於上面的委託定義事件
public event NumManipulationHandler ChangeNum;
上面的程式碼定義了一個名為 NumManipulationHandler 的委託和一個名為 ChangeNum 的事件,該事件是在某個值生成的時候會呼叫委託事件。
public class Program
{
public static void Main()
{
NumEvent even = new NumEvent(0);
even.ChangeNum += EventAction.Action;
even.SetValue(7);
even.SetValue(11);
System.Console.ReadKey();
}
}
public class NumEvent
{
private int value;
public delegate void NumManipulationHandler(NumEventArgs e);
public event NumManipulationHandler ChangeNum;
public virtual void OnChangeNum(NumEventArgs e)
{
ChangeNum?.Invoke(e);
}
public NumEvent(int n)
{
SetValue(n);
}
public void SetValue(int n)
{
if (value != n)
{
NumEventArgs e = new NumEventArgs(n);
value = n;
OnChangeNum(e);
}
}
}
public class EventAction
{
public static void Action(NumEventArgs e)
{
System.Console.WriteLine("value : " + e.value);
}
}
public class NumEventArgs : EventArgs
{
public int value;
public NumEventArgs(int _value)
{
this.value = _value;
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1806/viewspace-2808194/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter 介紹 & 經驗總結Flutter
- MySQL 分割槽介紹總結MySql
- WebKit介紹及總結(一)WebKit
- Javascript事件總結JavaScript事件
- QTreeView使用總結2,常用API介紹QTViewAPI
- RAID技術介紹和總結AI
- Java知識點總結(註解-介紹)Java
- MySQL Utilities工具介紹和命令列總結MySql命令列
- HBase的容錯性介紹和總結
- Linux Swap交換分割槽介紹總結Linux
- 【總結】二叉樹概念大總結二叉樹
- Redis介紹、使用、資料結構和叢集模式總結Redis資料結構模式
- JavaScript keydown事件總結JavaScript事件
- C#字串操作總結C#字串
- c# 練習總結C#
- 原創:ServletContext應用介紹總結ServletContext
- ORACLE優化器RBO與CBO介紹總結Oracle優化
- docker命令總結(二)Docker
- 二分總結
- 第二週總結
- 常見啟用函式的介紹和總結函式
- RabbitMQ實戰:擴充套件介紹與系列總結MQ套件
- Snmp學習總結(七)——SNMP4J介紹
- 記憶體資料庫快取介紹總結記憶體資料庫快取
- JS知識總結之事件JS事件
- jQuery知識總結之事件jQuery事件
- 前端基礎 — Web事件總結前端Web事件
- JS 總結之事件迴圈JS事件
- JavaScript入門⑧-事件總結大全JavaScript事件
- Laravel 事件系統用法總結Laravel事件
- oracle跟蹤事件(dump)總結Oracle事件
- log file sync等待事件總結事件
- ORACLE診斷事件的總結Oracle事件
- C#常用集合總結-2C#
- C# 索引器使用總結C#索引
- mysql總結(二)-事務MySql
- JavaScript基礎總結(二)JavaScript
- SQL進階總結(二)SQL