.Net边学边讲(三)

2016-01-29 19:16 1 1 收藏

.Net边学边讲(三),.Net边学边讲(三)

【 tulaoshi.com - ASP 】

  谈到event,就不能不先说一下callback和delegate
如果你使用过C的话,你应该知道有一个函数叫qsort,是用来给数组排序的。但这个函数显然不能承担广泛意义上的比较,因此你需要传递一个指针,他指向具有比较功能的函数。qsort在每次要比较数组元素时都要调用这个函数。这就是callback的概念,在.Net里也可以实现回调,方法是创建一个接口,实现他,传递一个实现此接口的对象的引用。delegate呢,你可以将他理解成一个安全的函数指针。
Notifications跟callback有点类似,但比简单的回调要复杂的多。callback意味着要调用的callback方法被调用的同时要调用的建立callback的方法。这是一个很紧密的耦合。而Notification则要松散一些,你可以注册将来某段时间会或者不会发生的Notification,只当他们发生时处理,否则不用。
你也许想让你写的组件当一些事情发生时通知其他组件,例如,你想写一个按钮组件,当你Click的时候你可能想通知其他组件,而其他组件将不得不准备向你请求Notification,你就要提供一个方法告诉他们你已经有一个可用的Notification。另一方面,你可能也是当其它组件的一些事情发生时希望被通知的人。这时你就需要找到那个特定组件可以提供什么Notification。
在.Net中event是一个你用来广播、引发、处理Notification的机制。大致是这样的,可以引发事件的组件声明这一事件。而希望处理某一特定组件的某一特定事件的组件通过传递一个方法的delegate向引发事件的组件注册。这样,当事件发生时引发事件的组件就会调用每个已注册的方法。通过delegate和event我们可以实现异步调用的功能。在C#中是这样声明一个代理的:public delegate void LogHandler(String message);代理在处理这种回调时已经是很强大了。但是当我们需要代理被存储以便以后的Notification,就有一点麻烦了。比如说我们有一个对象Button,有一个Click事件。我们可以声明一个ClickHandler 的代理类型用于处理Click事件,在我们的Button的Class中声明一个ClickHandler的public实例,这样其他组件希望Click发生时被通知,就可以简单的把他的代理加到Click代理中去。myButton.Click += new ClickHandler(MyMethod);
看上去着好像没什么问题。但是这里却存在一个大问题,我们声明Click代理是public,这违反了我们以前说过的data fields永远不要声明成public,这会有一系列麻烦。解决的办法是声明成private或protected,然后用属性解决读写。这样我们可以private声明Click,在写一对public方法去增加一个listener及减少一个listener。当然在.Net中,当你声明一个event时,.Net已经为你做好这一切了。声明一个事件:
class AlarmTimer {
public event EventHandler Alarm;
// ...
}
这段代码说明AlarmTimer可以向所有其它对象广播它可以引发一个叫Alarm的事件。Alarm事件用的是EventHandler代理类型。EventHandler:无返回值、接受两个参数(Object:指向事件的发送者,EventArgs:包含关于事件的数据)
看一个例子:
class AlarmTimer {
public event EventHandler Alarm;
private Timer myTimer;
public AlarmTimer() {
myTimer = new Timer();
myTimer.Tick += new EventHandler(OnTick);
}
public void Set(Double seconds) {
myTimer.Interval = (Int32)(seconds * 1000);
myTimer.Start();
}
protected void OnTick(Object sender, EventArgs e) {
myTimer.Stop();
if (Alarm != null) Alarm(this, EventArgs.Empty);
}
public void ReEnable() {
myTimer.Enabled = true;
}
}
注意AlarmTimer既引发事件(Alarm)又处理事件(Timer中的Tick事件)
static AlarmTimer myAlarm = new AlarmTimer();
public static void TestEvent() {
myAlarm.Alarm += new EventHandler(TimerEventProcessor);
myAlarm.Set(2);
Console.WriteLine("Timer is set; alarm will go off in two seconds");
Application.Run();
}
//处理事件
private static void TimerEventProcessor(
Object myObject, EventArgs myEventArgs) {
if (MessageBox.Show("Wake up! Continue ringing?",
"Count is: " + alarmCounter,
MessageBox.YesNo) == DialogResult.Yes) {
alarmCounter += 1;
myAlarm.ReEnable();
}
else {
Application.Exit();
}
}
注意:Object和EventArgs不是必需的参数,只是这是一个好的写法模式而已
关于event还有好多没有说,留着以后慢慢说吧。


 

来源:https://www.tulaoshi.com/n/20160129/1508925.html

延伸阅读
用SOAP实现数据通讯 长期以来我们使用超文本传输协议 HTTP 来提供 Web 页面以及往来的内容。但当我们将 HTTP 或一些其它 Internet 传输协议 同 XML 结合起来,并指定 XML 文档自身的格式时,你得到了简单对象访问协议 SOAP。至少在开始构想它时,SOAP是被设计为从本地系统向远程系统传递远端方法调用的。基于 SOAP 的结构与同时代的其...
标签: Web开发
一、理解颜色 我们在电脑屏幕上可以看到色彩斑斓的图像,其实这些图像都是由一个个像素点组成的。那么像素是什么?颜色又是什么呢?(如果您提出这两个问题,您一定是个热爱思考的人)一个像素其实对应着内存中的一组连续的二进制位,由于是二进制位,每个位上的取值当然只能是 0 或者 1 了!这样,这组连续的二进制位就可以由 0 ,1 排列组...
标签: Web开发
XSL模板与匹配模式       经过前几日的学习,我们学习了XHTML文档的编写和以及三个XSL元素,已能编写相当灵活的XSL文档,今天将学习的是XSL模板的编写。我们都知道,短的文档、程序十分好读,但当规模增大后,其复杂性也以更快的速度增加。       前面我们学了 xsl:for-each 、 xsl:value-o...
标签: Web开发
一、坐标系 其实只要玩过一点点图形编程的人都知道,电脑上的坐标系和数学上的坐标系稍微有点不同,坐标的原点在绘制区域(这里是Canvas)的左上角,X轴正向朝右,Y轴正向朝下,如下图 声明: 为本文为原创文章,作者保留所有权利!欢迎转载,转载请注明作者 左洸 和出处 博客园 二、Stroke 和 Fill HTML5中将图形分为两大类: ...
框架 Windows DNA 和 .NET 平台确保 Web 应用程序能很好地工作、具有可伸缩性,并可以在其它 Web 应用程序和服务中访问。但如何真正开始应用程序的开发呢?从哪里开始呢?怎样能把应用程序的基础建立在很多开发努力的结果之上呢?如果你发现另外一些人已经完成了学习过程,你能收获他们劳动的果实,这不是一件很好的事吗?这样的基础...

经验教程

34

收藏

45
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部