iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
佛心分享-IT 人自學之術

30 天從 Python 轉職場 C# 新手入門系列 第 20

Day20-委派 (Delegate) 與事件 (Event)

  • 分享至 

  • xImage
  •  

前言

前兩天學到 Lambda 運算式,發現它常常需要搭配委派 (Delegate) 使用。在 C# 中,委派是一種「型別安全的函式指標」,允許我們把方法當作參數傳遞;而事件 (Event) 則是基於委派的一種機制,用來設計「訂閱/通知」的模式,例如 UI 按鈕點擊、資料更新通知,這一篇文章,我們就來看看 委派與事件的基礎用法。


委派 (Delegate) 是什麼?

一種特殊的型別,代表可以指向「方法」的變數,可以將方法當成參數傳遞給其他方法,搭配 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!


事件 (Event) 是什麼?

事件是基於委派的通知機制,常見於 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!


今日小結:

  1. 委派 (Delegate) 是型別安全的函式指標,可以指向方法,並用於方法傳遞。
  2. 內建委派:Func 與 Action,讓我們不用自己宣告委派型別。
  3. 事件 (Event) 是基於委派的「通知/訂閱」機制,常用於 UI 或系統事件。

上一篇
Day19-Lambda 表達式與匿名函數-2
下一篇
Day21-C#使用 async 和 await 進行非同步編程
系列文
30 天從 Python 轉職場 C# 新手入門22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言