委托与事件
1.委托
定义一个委托: delegate void Show();
委托的执行
委托名.invoke()
委托名();
委托名。beginInvoke() // 开启一个新的线程 Core 里面不支持
2.C# 自带委托 Func 和 action
Func<string, string> func = (a) => { return a; }; //有返回值的,先参数,最后一位返回值 string n= func.Invoke("aaaaaaaaaa");
Action<DateTime> time = (ti) => { Console.WriteLine(ti.ToString()); };//无返回值
time.Invoke(DateTime.Now);
3.事件
public event Action<string> Show; 标准定义格式
下面是一个简单的事件订阅模式应用
public class Animal { private string name; public event EventHandler<EventArgs> NameChange; //定义事件 /// <summary> /// 发布者 /// </summary> public string Name { get => name; set{ if (name != value) { AnimalEventArgs animalEventArgs = new AnimalEventArgs(); animalEventArgs.oldValue = name; animalEventArgs.newValue = value; NameChange(this, animalEventArgs); } name = value; } } public void Show() { Console.WriteLine("这个Animal 内部方法"); } }
/// <summary>
/// 事件参数
/// </summary>
public class AnimalEventArgs : EventArgs { public string oldValue { get; set; } public string newValue { get; set; } }
/// <summary> /// 要订阅者,要做相应的变化 /// </summary>
public class master {
public void NameChange(object? sender, EventArgs e)
{ Console.WriteLine($"宠物主人呼叫{((AnimalEventArgs)e).newValue}");//当宠物改名了,大家就叫新的名字 }
}
static void Main(string[] args) { Animal animal=new Animal(); animal.NameChange += new master().NameChange;//订阅绑定事件 animal.Name = "贝贝"; animal.Name = "金毛"; }
输出结果:
宠物主人呼叫贝贝
宠物主人呼叫金毛
4.委托和事件的区别
事件更安全,只能在定义的类里面invoke() ,即使是子类也不可以
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!