`
csstome
  • 浏览: 1477860 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

c#事件

 
阅读更多

我在另一篇博客里面说到委托,其实在.net中一般都是将委托和事件放到一块去谈。因为对于事件机制,大家已经习惯了,即便对于Http无状态传输微软也将其进行了拆分,依次引入服务器端事件。

由于自己水平有限,不敢冒昧去说什么原理,只能凭借着自己的一些浅见和大家分享一下我所理解的事件,还是直接看例子吧。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyEvent
{
//定义一个事件参数,其中包含有和此事件相关的信息
//如果事件中不需要传递特殊参数,可以直接使用EventArgs
//自定义的必须继承与EventArgs这个类
class MyEventArgs : EventArgs
{
private int i;
public int I
{
get
{
return i;
}
set
{
i = value;
}
}
}


//定义一个事件发布者
class MyEventPublisher
{
//声明一个委托,其中第一个参数,是事件的发送者也就是触发者
public delegate void keyDownHandler(object sender,MyEventArgs e);

//定义一个事件,和委托定义不同之处就是前面多了一个event
public event keyDownHandler keyDown;//OnKeyDown就是一个委托的实例,我们通过给它赋值来执行一些方法

public void OnKeyDown(object sender, MyEventArgs e)
{
if (keyDown != null)
{
keyDown(this, e);
}
}
}

//事件订阅者,就是使用事件的一方
class MyEventSubscriber
{
public void Method(object sender, MyEventArgs e)//这个类基本上和MyEventPublisher类没有关系,仅仅就是和MyEventPublisher
//中的事件参数相同
{
Console.WriteLine(e.I);
}
}


class Program
{
static void Main(string[] args)
{
MyEventPublisher pub = new MyEventPublisher();
MyEventSubscriber sub = new MyEventSubscriber();
pub.keyDown+=new MyEventPublisher.keyDownHandler(sub.Method);//订阅者注册事件

MyEventArgs er=new MyEventArgs();
er.I=3;
object o = new object();
pub.OnKeyDown(o,er);//执行事件

Console.Read();
}
}
}

上面这个例子应该是比较常见的,所有要说的都写在了注释里面,由于时间关系这里不再赘余。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics