首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 與 Java 深度比較(二):委派與事件機制

     編輯:關於C語言

委派:類型安全的物件導向函式指標

委派是 C# 的核心特性,可視為「類型安全、物件導向的函式指標」。微軟在 MSVJ++ 6.0 中首次引入,旨在取代 C++ 指標,故譯為「指代」或「委派」。Sun 強烈反對,引發雙方激烈辯論。

委派優勢

  • 多點傳送:單一委派實例可同時參考多個方法,相當於 C++ 函式指標可指向多函式。
  • 類型安全:編譯期檢查簽章,避免執行期錯誤。
  • 簡化事件處理:無需像 Java 那樣定義介面與內部類別,即可靈活串接多個事件處理器。

事件:語言層級的原生支援

C# 以 delegate 與 event 關鍵字直接支援事件模型,區別於 Delphi 的閉包、Java 的介面適配、VC++ 的訊息迴圈。

完整範例:比賽計分與裁判系統

// 1. 定義委派型別
public delegate void ScoreChangeEventHandler(int newScore, ref bool cancel);

// 2. 事件發送者
public class Game
{
    public event ScoreChangeEventHandler ScoreChange;
    private int score;

    public int Score
    {
        get { return score; }
        set
        {
            if (score != value)
            {
                bool cancel = false;
                ScoreChange?.Invoke(value, ref cancel);
                if (!cancel) score = value;
            }
        }
    }
}

// 3. 事件訂閱者
public class Referee
{
    public Referee(Game game)
    {
        game.ScoreChange += Game_ScoreChange;
    }

    private void Game_ScoreChange(int newScore, ref bool cancel)
    {
        if (newScore < 100)
            Console.WriteLine("Good Score");
        else
        {
            cancel = true;
            Console.WriteLine("No Score can be that high!");
        }
    }
}

// 4. 測試
public class GameTest
{
    public static void Main()
    {
        Game game = new Game();
        Referee referee = new Referee(game);
        game.Score = 70;   // 輸出 Good Score
        game.Score = 110;  // 輸出 No Score can be that high!
    }
}

關鍵點解析

  • event 關鍵字限制委派僅能在類別內部觸發,對外僅暴露 +=/-= 訂閱/取消訂閱操作。
  • 單一事件可綁定多個處理器,形成發布-訂閱模式。
  • Game 類別完全不感知 Referee 存在,實現鬆耦合。

歷史軼事

Anders Hejlsberg(委派發明者)被 James Gosling 戲稱「函式指標先生」;而 Java 大量使用介面,Gosling 反被戲稱為「全都是介面先生」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved