澳门在线威尼斯官方 > 澳门在线威尼斯官方 > 知识回想

原标题:知识回想

浏览次数:123 时间:2019-12-13

二、采取 EventHandler 方式公布事件

  1.那边采用继续了 BCL 中的类 EventArgs,能够在事件的触发时开展数据的传递。

1     class MyEventArgs : EventArgs
2     {
3         public string Message { get; private set; }
4 
5         public MyEventArgs(string message)
6         {
7             Message = message;
8         }
9     }

 

  2.这里的第贰个参数就是自定义的 MyEventArgs 类型,它三番一遍了 伊芙ntArgs。 

    delegate void MyEventHandler(object sender, MyEventArgs args);

 

  3.声称事件的二种样式:

    (1)若无自定义 伊夫ntArgs 类,你能够直接行使 C# 中暗中同意提供的非泛型 EventHandler 委托。

public event EventHandler MyEvent;

 

    (2)即使运用的大是大非泛型的 EventHandler,并且写了贰个自定义由 EventArgs 派生的类,可修正如下。

public event MyEventHandler MyEvent;

 

    (3)假若应用的是尖端的泛型版本,就无需自定义委托。你只须要轻巧地将事件类型内定为 EventHandler<My伊夫ntArgs>,将尖括号中的内容替换为投机的类的名称。  

public event EventHandler<MyEventArgs> MyEvent;

 

  昨天,通过《C# 知识回顾 - 事件入门》介绍了事件的定义及轻巧用法,后天我们因此调整台来看下“公布

  • 订阅”的着力用法。

 

意气风发、发布依照 .NET 类库的风云

  .NET类库中的所有的事件均基于 EventHandler 委托,定义如下:  

public delegate void EventHandler(object sender, EventArgs e);

  你可以品尝手动输入 EventHandler澳门在线威尼斯官方 , ,然后按下“F12”跳转到定义:

澳门在线威尼斯官方 1

 

  .NET 2.0 引进了该信托的贰个泛型版本,即 EventHandler<TEventArgs>。

  【备注】纵然大家定义的事件可以依据其余自定的寄托项目,但建议采纳内置的 EventHandler 实行扩展。

 

C# 知识回想 - Event 事件

传送门

  《C# 知识回想 - 连串化》

  《C# 知识回看 - 表明式树 Expression Trees》

  《C# 知识回看 - 天性Attribute》、《深入深入分析AssemblyInfo.cs - 领会常用的特点 Attribute》

  《C# 知识回看 - 委托 delegate》、《C# 知识回看 - 委托 delegate (续)》

  《C# 知识回想 - 事件入门》

 


【参考】

【参谋】微软官方文书档案

【博主】反骨仔    【原文】  

三、四个简易的公告订阅 德姆o

  上边包车型大巴以身作则通过将自定义的 My伊夫ntArgs 类和 EventHandler<TEventArgs> 举行亲自过问:

This is MyEventArgs.cs  //事件参数

 1     /// <summary>
 2     /// 事件参数
 3     /// </summary>
 4     /// <remarks>一个自定义的类:自定义事件的参数</remarks>
 5     class MyEventArgs : EventArgs
 6     {
 7         public string Message { get; }
 8 
 9         public MyEventArgs(string message)
10         {
11             Message = message;
12         }
13     }

 

This is Publisher.cs  //发布者

 1     /// <summary>
 2     /// 事件发布者
 3     /// </summary>
 4     class Publisher
 5     {
 6         //声明一个泛型事件
 7         public event EventHandler<MyEventArgs> MyEvent;
 8 
 9         public void Publish()
10         {
11             Console.WriteLine("Publis is starting");
12 
13             //你可以在事件触发前写些代码
14 
15             OnMyEvent(new MyEventArgs(DateTime.Now.ToString()));
16         }
17 
18         /// <summary>
19         /// 触发事件
20         /// </summary>
21         /// <param name="args"></param>
22         /// <remarks>虚方法,允许子类重写调用行为</remarks>
23         protected virtual void OnMyEvent(MyEventArgs args)
24         {
25             //只有在事件订阅时(!= null),才触发事件
26             MyEvent?.Invoke(this, args);
27         }
28     }

 

This is Subscriber.cs  //订阅者

 1     /// <summary>
 2     /// 订阅者
 3     /// </summary>
 4     class Subscriber
 5     {
 6         public Guid Guid { get; }
 7 
 8         public Subscriber(Publisher publisher)
 9         {
10             Guid = Guid.NewGuid();
11             //使用 C# 2 的语法进行订阅
12             publisher.MyEvent += Publisher_MyEvent;
13         }
14 
15         /// <summary>
16         /// 事件处理程序
17         /// </summary>
18         /// <param name="sender"></param>
19         /// <param name="args"></param>
20         private void Publisher_MyEvent(object sender, MyEventArgs args)
21         {
22             Console.WriteLine($"    Message is {args.Message}, Guid is {Guid}.");
23         }
24     }

 

This is Program.cs   //控制台,用于启动

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var publisher = new Publisher();
 6             var subscriber1 = new Subscriber(publisher);
 7             var subscriber2 = new Subscriber(publisher);
 8 
 9             //触发事件
10             publisher.Publish();
11 
12             Console.WriteLine("OK!");
13             Console.Read();
14         }
15     }

 澳门在线威尼斯官方 2

 

四、落成自定义事件访谈器

  事件生机勃勃种是特体系其余多播委托,只好从注解它的类中实行调用。那一个情势需求事前通过事件访谈器加多到委托的调用列表中,事件访谈器跟我们平昔接受的质量访谈器,特殊的是他们的名字,事件访谈器被取名字为 add 和 remove。假如在代码中未有提供自定义的事件访问器,编写翻译器会自动抬高事件访谈器。但在有些景况下,您可能供给提供自定义的行事。

 1     class MyClass
 2     {
 3         /// <summary>
 4         /// 锁
 5         /// </summary>
 6         private static object Locker = new object();
 7 
 8         /// <summary>
 9         /// 接口
10         /// </summary>
11         public interface IMyEvent
12         {
13             event EventHandler OnCall;
14         }
15 
16         public class MyEvent : IMyEvent
17         {
18             /// <summary>
19             /// 触发前事件
20             /// </summary>
21             event EventHandler PreEvent;
22 
23             public event EventHandler OnCall
24             {
25                 add
26                 {
27                     lock (Locker)
28                     {
29                         PreEvent += value;
30                     }
31                 }
32                 remove
33                 {
34                     lock (Locker)
35                     {
36                         PreEvent += value;
37                     }
38                 }
39             }
40         }
41     }

 

目录

  • 透露根据 .NET 类库的平地风波
  • 应用 伊芙ntHandler 形式发表事件
  • 三个回顾的公告订阅 德姆o
  • 落到实处自定义事件访谈器

 

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:知识回想

关键词:

上一篇:难道你不知道可以边玩游戏变学习编程么

下一篇:没有了