当前位置:   article > 正文

C# event 事件_c# event 赋值 event

c# event 赋值 event

0.前言

事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。 任何其他组件都可以订阅事件,并在事件引发时得到通知,在设计模式中叫做观察者模式。和委托类似,事件是后期绑定机制。 用于定义事件以及订阅或取消订阅事件的语法是对委托语法的扩展。

1.事件的使用

在C# GUI程序中,事件处理是很常用的,比如C# WPF中一个按钮的点击,可以对应到一个事件处理方法:

  1. private void Button_Click(object sender, RoutedEventArgs e)
  2. {
  3. Console.WriteLine(sender.ToString() + ":" + e.ToString());
  4. }

在类的内部声明事件,需要先有一个委托类型。然后,使用event定义一个成员(使用event关键字后,这个委托类型的字段就不能使用=赋值,只能+=或者-=)。其实操作流程和委托差不多,下面的代码定义了一个Sender和一个Receiver类,Sender的事件被传递给Receiver,然后执行事件处理方法。

  1. using System;
  2. namespace TestCS_20191117_event
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. Sender sender = new Sender();
  9. Receiver receiver = new Receiver();
  10. sender.AHandler += receiver.OnAChanged;
  11. sender.BHandler += receiver.OnBChanged;
  12. sender.CHandler += receiver.OnCChanged;
  13. sender.SomeChange();
  14. Console.ReadKey();
  15. }
  16. }
  17. class Sender
  18. {
  19. //1. 使用自定义的delegate
  20. public delegate void MyEventHandler(string arg);
  21. public event MyEventHandler AHandler;
  22. //2. 使用EventHandler
  23. public class MyArgs:System.EventArgs
  24. {
  25. public MyArgs(string arg)
  26. {
  27. Arg = arg;
  28. }
  29. public string Arg { get; set; }
  30. }
  31. //注意,赋值了一个空委托,这样就不必检查是否有接收者(调用前判断null)
  32. public event EventHandler<MyArgs> BHandler = delegate { };
  33. //3. 声明泛型委托类型
  34. //(where指定约束类型)
  35. public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
  36. where TEventArgs : EventArgs;
  37. //使用上面定义的MyArgs:System.EventArgs来实例化
  38. public event EventHandler<MyArgs> CHandler = delegate { };
  39. //想要引发事件时,使用委托调用语法调用事件处理程序
  40. public void SomeChange()
  41. {
  42. AHandler?.Invoke("AHandler");
  43. BHandler?.Invoke(this, new MyArgs("BHandler"));
  44. CHandler?.Invoke(this, new MyArgs("CHandler"));
  45. }
  46. }
  47. class Receiver
  48. {
  49. public void OnAChanged(string arg)
  50. {
  51. System.Console.WriteLine("a changed:" + arg);
  52. }
  53. public void OnBChanged(object sender,Sender.MyArgs arg)
  54. {
  55. System.Console.WriteLine("b changed:" + arg.Arg);
  56. }
  57. public void OnCChanged(object sender, Sender.MyArgs arg)
  58. {
  59. System.Console.WriteLine("c changed:" + arg.Arg);
  60. }
  61. }
  62. }

2.使用委托完成观察者模式

如果没有事件,我们可以通过多播委托来实现发布-订阅的一个功能。发布者声明一个委托成员,当数据改变时就调用委托,而委托列表中添加了多个订阅者的回调方法。代码如下:

  1. using System;
  2. namespace TestCS_20191117_event
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. Sender sender = new Sender();
  9. Receiver receiver = new Receiver();
  10. sender.TestChang += receiver.OnTestChanged;
  11. sender.Test = "new test";
  12. Console.ReadKey();
  13. }
  14. }
  15. class Sender
  16. {
  17. public Action<string> TestChang { get; set; }
  18. private string test;
  19. public string Test
  20. {
  21. get { return test; }
  22. set
  23. {
  24. if (value != test)
  25. {
  26. test = value;
  27. // test值改变就调用委托
  28. TestChang?.Invoke(value);
  29. }
  30. }
  31. }
  32. }
  33. class Receiver
  34. {
  35. public void OnTestChanged(string arg)
  36. {
  37. System.Console.WriteLine("test changed:" + arg);
  38. }
  39. }
  40. }

3.参考

MSDN文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/events-overview

书籍:C#本质论
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/984202
推荐阅读
  

闽ICP备14008679号