委托与事件
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() ,即使是子类也不可以