第三十五式:C# 委托 (飞鸽传书)

绝世
秘籍
冲儿,普通的变量存的是“数据”(内力),但有一种特殊的变量,存的是“方法”(招式)。
你可以把这个变量传给别人,别人拿到后,就可以使出这一招。
这在 C# 中叫委托 (Delegate)
把招式打包送人?听起来像把“独孤九剑”写在锦囊里,谁拿到谁就能用?

1. 定义委托 - 锦囊格式

首先要规定锦囊里能装什么样的招式(参数和返回值必须匹配)。


// 定义一个委托:能装“没有返回值,接收一个字符串”的招式
public delegate void SendMessage(string msg);
        

2. 使用委托 - 塞入招式


class Messenger
{
    public void ByPigeon(string msg) 
    { 
        Console.WriteLine("飞鸽传书:" + msg); 
    }

    public void ByHorse(string msg) 
    { 
        Console.WriteLine("快马加鞭:" + msg); 
    }
}

// Main:
Messenger m = new Messenger();

// 1. 把“飞鸽”招式装进委托
SendMessage delegate1 = new SendMessage(m.ByPigeon);

// 2. 调用委托(相当于调用了 ByPigeon)
delegate1("你好!"); // 输出:飞鸽传书:你好!

// 3. 换个招式
delegate1 = m.ByHorse;
delegate1("急报!"); // 输出:快马加鞭:急报!
        

3. 多播委托 - 万箭齐发

一个委托里可以装好几个招式!用 += 连接。


SendMessage all = m.ByPigeon;
all += m.ByHorse; // 再加一招

all("进攻!"); 
// 输出两行:
// 飞鸽传书:进攻!
// 快马加鞭:进攻!
        
委托是 C# 非常核心的概念,它是事件 (Event)Lambda 表达式 的基础。
现在的 C# 程序员通常直接用 Action(无返回值)和 Func(有返回值)这两个现成的委托,不用自己定义 delegate 了。
🕊️

动手时刻:军令状

使用 Action<string>(系统自带的委托)。

定义两个方法:AttackRetreat

把它们都绑到一个 Action 上,一次性执行。

查看参考答案

Action order;

void Attack(string target) => Console.WriteLine("进攻 " + target);
void Retreat(string target) => Console.WriteLine("撤离 " + target);

order = Attack;
order += Retreat;

order("黑木崖");
                    

成就解锁:【信使】 获得:飞鸽