前兩天學到 Lambda 運算式,發現它常常需要搭配委派 (Delegate) 使用。在 C# 中,委派是一種「型別安全的函式指標」,允許我們把方法當作參數傳遞;而事件 (Event) 則是基於委派的一種機制,用來設計「訂閱/通知」的模式,例如 UI 按鈕點擊、資料更新通知,這一篇文章,我們就來看看 委派與事件的基礎用法。
一種特殊的型別,代表可以指向「方法」的變數,可以將方法當成參數傳遞給其他方法,搭配 Lambda 運算式,可以大幅簡化程式。先看以下範例 1-定義與使用委派:
using System;
class Program
{
// 宣告一個委派,代表「輸入 int,回傳 int」
delegate int MathOperation(int x);
static void Main()
{
// 使用委派指向不同方法
MathOperation square = Square;
MathOperation doubleValue = Double;
Console.WriteLine($"Square(5) = {square(5)}");
Console.WriteLine($"Double(5) = {doubleValue(5)}");
}
static int Square(int x) => x * x;
static int Double(int x) => x * 2;
}
輸出:
Square(5) = 25
Double(5) = 10
接下來看到範例 2-使用內建的 Func 委派:
C# 已經提供了泛用的委派型別,不需要每次自己宣告:Func<T1, T2, TResult>
:有回傳值的方法
、Action<T>
:沒有回傳值的方法。
using System;
class Program
{
static void Main()
{
Func<int, int> square = x => x * x;
Action<string> greet = name => Console.WriteLine($"Hello, {name}!");
Console.WriteLine($"Square(4) = {square(4)}");
greet("Alice");
}
}
輸出:
Square(4) = 16
Hello, Alice!
事件是基於委派的通知機制,常見於 GUI 或系統事件,例如:
範例 3:事件的基本用法
using System;
class Publisher
{
// 宣告事件:當有人訂閱,會收到 string 訊息
public event Action<string> OnMessage;
public void SendMessage(string msg)
{
Console.WriteLine("Publisher 發送訊息...");
OnMessage?.Invoke(msg); // 觸發事件(安全呼叫)
}
}
class Subscriber
{
public void Receive(string msg)
{
Console.WriteLine($"Subscriber 收到訊息:{msg}");
}
}
class Program
{
static void Main()
{
var publisher = new Publisher();
var subscriber = new Subscriber();
// 訂閱事件
publisher.OnMessage += subscriber.Receive;
// 發送訊息
publisher.SendMessage("Hello, Event!");
}
}
輸出:
Publisher 發送訊息...
Subscriber 收到訊息:Hello, Event!
今日小結: