返回 C#常用知识小短篇

委托与事件

以下为完整正文内容。

正文

先提关键点: 委托是把方法当参数传 事件是发生什么的时候通知我 那么好,来看委托 // 委托:定义一个方法的签名 //(签名:就是(int a, int b) 这样一个参数形式,这个形式的签名只接受(int a ,int b)形式的参数,如(1,2),其他任何形式均不接受。 //如(你好,world)、(1,hello)、(1,2,3)、(1)等均不接收) delegate int Calculate(int a, int b); class Calculator { public int Execute(int x, int y, Calculate func) { return func(x, y); // 把方法当参数执行,这里的方法func 是以参数的形式穿进来并使用的 } } // 使用:传不同的方法,得到不同结果 var calc = new Calculator(); //(a,b)=>就是被当做参数传进去的方法 int sum = calc.Execute(3, 5, (a, b) => a + b); // 8 //同上 int product = calc.Execute(3, 5, (a, b) => a * b); // 15 //传入不同的方法,就可以进行不同的工作 然后看事件 例子: Button button = new Button(); Window window1 = new Window { Title = "主窗口" }; Window window2 = new Window { Title = "弹窗" }; //订阅事件:把窗口的处理方法注册到按钮的 Click 事件上 //+= 就是把方法加入“通知名单” button.Click += window1.HandleButtonClick; button.Click += window2.HandleButtonClick; //到此订阅部分结束 //模拟按钮被点击,触发事件 button.PerformClick(); //按钮类封装了“被点击”的行为 //它不知道自己被点之后会发生什么,只管通知订阅者 class Button { // Action 是一个无参数、无返回值的委托类型 // 用 event 修饰后,外部只能 += 或 -=,不能直接赋值 // 这保护了订阅列表不被外部意外覆盖 public event Action Click; //模拟按钮被按下的动作 public void PerformClick() { Console.WriteLine("按钮:我被按下了"); // 触发 Click 事件,通知所有订阅者 // ?.Invoke() 等价于:如果 Click 不是 null,就调用它 // 防止没人订阅时出现 NullReferenceException Click?.Invoke(); //Invoke就是把订阅列表挨个执行一遍 } } //窗口类:关心按钮是否被点击 //它订阅按钮的 Click 事件,以便在按钮被点时做出响应 class Window { // 自动属性 { get; set; },可读可写 public string Title { get; set; } //按钮被点击时的处理方法 //签名必须是无参数、无返回值,和 Action 委托匹配 public void HandleButtonClick() { Console.WriteLine($"窗口 [{Title}] 收到:按钮被点了"); } } 无注释版本 var button = new Button(); var window1 = new Window { Title = "主窗口" }; var window2 = new Window { Title = "弹窗" }; button.Click += window1.HandleButtonClick; button.Click += window2.HandleButtonClick; button.PerformClick(); class Button { public event Action Click; public void PerformClick() { Console.WriteLine("按钮:我被按下了"); Click?.Invoke(); } } class Window { public string Title; public void HandleButtonClick() { Console.WriteLine($"窗口 [{Title}] 收到:按钮被点了"); } }