在C#中,委托是一種引用類型的數據類型,允許我們封裝方法的引用。通過使用委托,我們可以將方法作為參數傳遞給其他方法,或者將多個方法組合在一起,從而實現更靈活的編程模式。委托類似於函數指針,但提供了類型安全和垃圾回收等現代語言特性。 基本概念 定義委托 定義委托需要指定它所代表的方法的原型,包括返回類 ...
在C#中,委托是一種引用類型的數據類型,允許我們封裝方法的引用。通過使用委托,我們可以將方法作為參數傳遞給其他方法,或者將多個方法組合在一起,從而實現更靈活的編程模式。委托類似於函數指針,但提供了類型安全和垃圾回收等現代語言特性。
基本概念
定義委托
定義委托需要指定它所代表的方法的原型,包括返回類型和參數列表。例如:
public delegate int MyDelegate(int a, int b);
這定義了一個名為MyDelegate
的委托,它代表一個接受兩個整數參數並返回一個整數的方法。
創建委托實例
創建委托實例時,可以使用new
關鍵字加上委托類型和要封裝的方法名:
MyDelegate myDelegate = new MyDelegate(AddNumbers);
其中AddNumbers
是一個符合MyDelegate
定義的方法。
調用委托
一旦有了委托實例,就可以像調用方法一樣調用它:
int result = myDelegate(5, 3);
多播委托
委托可以被設計為“多播”的,這意味著它們可以調用多個方法。當調用多播委托時,所有註冊的方法都會按順序執行:
MyDelegate del1 = new MyDelegate(AddNumbers);
MyDelegate del2 = new MyDelegate(MultiplyNumbers);
MyDelegate combinedDel = del1 + del2;
combinedDel(5, 3); // 先調用 AddNumbers, 然後調用 MultiplyNumbers
匿名方法和Lambda表達式
從C# 2.0開始,可以使用匿名方法來定義委托:
MyDelegate anonMethod = delegate(int x, int y) { return x + y; };
而在C# 3.0之後,Lambda表達式成為更簡潔的選擇:
MyDelegate lambdaExpr = (int x, int y) => x + y;
事件
在C#中,事件是一種特殊的委托類型,用於封裝消息的發送機制,通常用於組件之間或對象之間的通信。事件是.NET框架中處理非同步操作、UI交互和信號通知的核心機制。下麵詳細介紹事件的概念、定義和使用。
事件的基本概念
事件允許一個類(事件發佈者)向另一個或多個類(事件訂閱者)廣播信息,而無需直接調用接收方的任何方法。這實現了發佈者和訂閱者之間的解耦,使得代碼更加模塊化和可維護。
定義事件
事件基於委托類型定義,通常使用System.EventHandler
或自定義的委托類型。定義事件時,通常在類中聲明一個委托類型的私有欄位,併在此基礎上聲明一個公共的事件屬性。例如:
public class Publisher
{
// 自定義委托類型
public delegate void MyEventHandler(object source, MyEventArgs args);
// 定義事件
private event MyEventHandler myEvent;
// 使用事件屬性暴露事件
public event MyEventHandler MyEvent
{
add { myEvent += value; }
remove { myEvent -= value; }
}
// 觸發事件
public void RaiseEvent()
{
if (myEvent != null)
{
myEvent(this, new MyEventArgs());
}
}
}
在這個例子中,Publisher
類有一個名為MyEvent
的事件,它基於MyEventHandler
委托類型。事件觸發時,RaiseEvent
方法會被調用,它會檢查是否有訂閱者,並調用所有訂閱者的相應方法。
訂閱和取消訂閱事件
事件可以通過事件處理程式來訂閱。事件處理程式是一個與事件委托類型匹配的方法。訂閱事件時,將事件處理程式添加到事件中;取消訂閱則移除該處理程式。
class Subscriber
{
public void OnMyEvent(object sender, MyEventArgs e)
{
Console.WriteLine("Event triggered.");
}
}
// 在某個地方訂閱事件
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
publisher.MyEvent += subscriber.OnMyEvent;
// 取消訂閱事件
publisher.MyEvent -= subscriber.OnMyEvent;
使用事件參數
事件經常與事件參數一起使用,這些參數通常封裝了事件發生時的附加信息。事件參數是通過繼承EventArgs
類來創建的。例如:
public class MyEventArgs : EventArgs
{
public string Message { get; set; }
}
在觸發事件時,可以創建事件參數的實例並傳遞給事件:
public void RaiseEvent()
{
if (myEvent != null)
{
myEvent(this, new MyEventArgs { Message = "Hello, world!" });
}
}
本文來自博客園,作者:Y00,轉載請註明原文鏈接:https://www.cnblogs.com/ayic/p/18295844
聊聊技術,聊聊人生。歡迎關註我的公眾號!^_^