`
fdyang
  • 浏览: 79664 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

(C#)事件(Event)

阅读更多

(C#)事件(Event)

 

事件好像是被简化的针对特殊用途的委托。

 

事件有如下重要事项:

- 触发(raise)事件: 调用(invoke)或解除(fire)事件的术语。当事件被触发时,所有注册到他的方法都会被依次调用。

- 发布者(publisher): 让事件被其他类或结构可见并使用的类或结构。(事件成员list)

- 订阅者(subscriber): 把事件和发布者关联注册的类或结构.

- 事件处理程序(event handler): 注册到事件的方法。

- 事件是成员,不是类型.并且事件成员被隐式自动初始化为null.

 

实际上,事件包含了一个私有的委托。

- 事件提供了对它的私有控制委托的结构化访问。

- 与委托中的其他操作不同,对于事件只可以添加,删除,或调用事件处理程序。

  所以,只有 +=,-=的运算符能出现在事件的左边。

- 事件被触发时,它调用委托来一次调用列表中的方法。

 

需要在事件中使用的代码有5部分。

1.2. 源代码中: 委托类型声明 和 事件注册

3.4. 发布者类: 事件声明 和 触发事件的代码

5.   订阅者类: 事件处理程序声明

 

 

 

声明事件

   - 发布者类必须提供事件和触发事件的代码.

   public event EventHandler MyEvent1;     //EventHandler:委托类型, MyEvent1:事件名

   - 其中EventHandler 是.NET BCL使用的并被指定为事件使用标准的预定义委托类型。声明如下:

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

 

触发事件

   - 在触发事件前和null比较,从而查看是否包含事件。

   - 触发事件本身看起来像调用函数.

   if (MyEvent1!=null){

MyEvent1(source,args) ;

   }

 

订阅事件

   为事件添加事件处理程序,处理程序必须有和事件委托一致的返回类型和签名。

   - += 运算符来为事件增加事件处理程序。

   - 方法可以如下:

     .实例方法:  myClass.MyEvent1 += classA.TimerHandlerA;

     .静态方法:  myClass.MyEvent1 += ClassB.TimerHandlerB;

     .委托形式:  myClass.MyEvent1 += new EventHandler(classC.TimerHanderC); 

     .lambda 表达式: (略)

 

标准事件 public delegate void EventHandler(object sender, EventArgs e);

    - 第一个参数用来保存触发事件的对象的引用。

    - 第二个参数用来保存有关状态对于应用程序来书是否合适的状态信息

      .注:EventAgs 不能传递任何数据,如果需要传递数据,可以申明一个EventAgs的继承类.

    实际上,Object类和EventArgs类为基类,通过继承可以提供了对所有数据类型和所有事件的处理。

    public class MyEventArgs:EventArgs

    {

public string Message;    

public MyEventArgs(string s)   //构造函数中,初始化成员Message.

{

   Message = s; 

}

     }

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics