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

C# 委托與事件詳解(二)

     編輯:關於C語言

思考新方案前,觀察 GreetPeople(string name, Language lang) 簽名。string name 中 string 為參數類型,name 為變量,賦不同值代表不同含義。

若參數能代表方法 呢?命名為 MakeGreeting,調用時傳入 EnglishGreeting 或 ChineseGreeting,方法體內像用普通參數一樣用 MakeGreeting(name)。

改寫:

public void GreetPeople(string name, *** MakeGreeting) {
    MakeGreeting(name);
}

關鍵問題:*** 處該填什麼類型?枚舉已不需,因方法內部已區分語言。答案是委托:它定義參數能代表的方法種類(參數類型與返回類型)。

觀察目標方法簽名:

public void EnglishGreeting(string name)
public void ChineseGreeting(string name)

如同 name 只接受 string,委托定義 MakeGreeting 能代表的方法簽名:

public delegate void GreetingDelegate(string name);

與 EnglishGreeting 簽名除 delegate 關鍵字外完全一致。改寫 GreetPeople:

public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
    MakeGreeting(name);
}

委托出現位置同 string,確為一類型。實際編譯時委托確會生成類。完整代碼:

using System;
namespace Delegate {
    public delegate void GreetingDelegate(string name);
    class Program {
        private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); }
        private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); }
        private static void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); }
        static void Main() {
            GreetPeople("Jimmy Zhang", EnglishGreeting);
            GreetPeople("張子陽", ChineseGreeting);
            Console.ReadKey();
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved