学习action笔记
假设有个叫外卖的场景
打电话给餐厅:"给我做个三明治,做好了叫我。"
餐厅说:"我不知道你的电话号码,没法叫你。"
因为没有 Action,餐厅不知道做好后怎么通知你。
如果有Action:
// 餐厅的菜单
public class Restaurant
{
// 接受订单:你要什么 + 做好了打哪个电话
public void MakeSandwich(string filling, Action<string> callWhenDone)
{
Debug.Log($"厨房收到:做一个 {filling} 三明治");
// 假装做饭等了 2 秒
System.Threading.Thread.Sleep(2000);
string message = $"你的 {filling} 三明治好了!";
// 照着便条上的电话打过去
callWhenDone?.Invoke(message);
}
}
// 你(顾客)
public class Customer
{
public void Order()
{
Restaurant restaurant = new Restaurant();
// 点餐:我要鸡蛋三明治,这是我的电话 ↓↓↓
restaurant.MakeSandwich("鸡蛋", notice =>
{
Debug.Log($"收到通知:{notice}"); // 电话响了,你接起来
});
}
}
Action<string> callWhenDone 就是留给餐厅的电话号码。
- 餐厅不管你是谁,也不管你接到电话后干嘛(吃还是扔)
- 餐厅只管:饭做完了 → 打这个电话 → 把通知内容告诉你
两个参数的例子:
// 快递公司 public class ExpressCompany { // 寄快递:东西 + 寄完了打这个电话(告诉你是/否成功 + 快递单号) public void Send(string itemName, Action<bool, string> callWhenDone) { Debug.Log($"收到包裹:{itemName}"); // 假装寄件处理…… bool success = true; string trackingNumber = "SF1234567890"; // 📞 打电话告诉你两个信息 callWhenDone?.Invoke(success, trackingNumber); } } // 你 public class Me { public void SendPackage() { ExpressCompany sf = new ExpressCompany(); sf.Send("键盘", (done, number) => { if (done) Debug.Log($"寄出成功,单号:{number}"); else Debug.Log("寄件失败"); }); } }