当前位置: 首页 > 图文教程 > .Net技术 > ASP.NET > ASP.NET:小编谈理解.NET委托和事件

ASP.NET
VS2008SP1下jQuery使用初体验
使用asp.net 2.0中的SqlBulkCopy类批量复制数据
asp.net定点执行任务总结
通过webBrowser 来轻松模拟网页来源
ASP.NET框架 数据回发与事件回发
浅谈ASP.NET内部机制
通用语言规范
GC垃圾回收
ASP.NET 配置
ASP.NET 安全认证
ASP.NET生成复合控件
asp.net中forms验证
DataTable中数据记录的统计
关于无aspx文件部署,我的一些探索心得
ASP.NET刷新页面的六种方法
ASP.NET MVC应用程序的本地化、单元测试
详解ASP.NET的四种状态
.NET与Java间进行Web Service交互的选择
自己动手实现Asp.net的MVC框架
ASP.net中网站访问量统计方法

ASP.NET:小编谈理解.NET委托和事件


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 184 ::
收藏到网摘: n/a

windows系统里应该有一个监听程序,专门处理鼠标点击事件,一旦button被点击,他就会执行一定的程序。大概应该像下面的伪代码一样:

ListenerMethod(){
if(button.clicked)
{……}
}

 

 

 

 

 

我就可以在{}里写上label1.text=“欢迎第一次来软晨学习网,搞定!如果要实现其他内容,比如再一次点击,就label.text=“欢迎第二次来软晨学习网!。到此为止,你发现问题么?

在学习了设计模式之后才想到的,如果按上面的方法实现,就:

1、你必须把ListenerMethod()方法的具体内容公布出来,不然人家怎么用呢,这些执行的代码写在哪里呢

2、把方法公开是不好的,为什么?理解关键字封装!接着想,我要不把ListenerMethod()方法暴露出来要怎么办。可不可以事先写好一个方法,放在{}里,其他人在其他地方写实现的代码,如:

ListenerMethod(){
if(button.clicked){
TheMethod();  //
只要按钮被点击就执行这个方法;
}
}

 

 

 

 

 

 

而在另外的地方设好方法名和参数,让其他人填空,如下

TheMethod(){
……//
里面的内容由其他人(专业点的词汇叫做用户)填写
}

 

 

 

 

 

我们好像也是这样在buttonClick()方法里写实现程序的哟。

这样做,还是有问题,能不能想到?

现在我们是一个button,如果有两个button要实现各自不同的的功能呢,怎么办?我写两个if,三个呢,四个呢……这就要回到最前面猜想的地方了。buttonListener之间是不是要有对应关系?

这种对应关系如何实现?

我们可以想象,计算机系统里面有一个管理鼠标点击button的监听中心,每个button都可以到这个中心注册登记他对应的方法,这样,当特定的button被点击时,监听中心可以根据之前的登记,执行相应的方法。
看上去上面的方法不错,赞自己一个。那么如何实现上面的构想呢?当然就是用委托和事件了。

为了脱离winform之类已有的框架,我们建一个控制台程序。

未使用委托、事件之前的代码。

Code
class Program
{
static void Main(string[] args)
{
//
实例化一个button
Button btn = new Button();
btn.Click();
}
}

 

//首先要定义一个Button类,里面应该有一个Click方法
public class Button
{
//Click
方法调用固定的方法
public void Click()
{
ForCustome fc = new ForCustome();
fc.Button_Click();
}
}
//
上面这个类是封装了的,用户不可见,或者理解为用户不能更改也可以

 

//下面这个类提供给用户
public class ForCustome
{
public void Button_Click()
{
//
用户在这里写具体的方法实现
Console.WriteLine("
被点击了!");
}

 

}


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

可以看出,以上的代码实现一个按钮是可行的,但两个按钮就麻烦了。

Code
class Program
{
static void Main(string[] args)
{
//
实例化一个button
Button btn = new Button();
btn.Click();

 

//实例化第二个button
Button btn2 = new Button();
btn.Click();   //
这样写能行么?
}
}

 

//首先要定义一个Button类,里面应该有一个Click方法
public class Button
{
//Click
方法调用固定的方法
public void Click()
{
ForCustome fc = new ForCustome();
fc.Button_Click();

 

//很想在这里面改呀,添一个方法调用
fc.Button2_Click();     //
要是再有一段条件判断的逻辑就更好了,是吧?
}
}
//
上面这个类是封装了的,用户不可见,或者理解为用户不能更改也可以

 

//下面这个类提供给用户
public class ForCustome
{
public void Button_Click()
{
//
用户在这里写具体的方法实现
Console.WriteLine("
被点击了!");
}

 

//添一个方法实现是必须的
public void Button2_Click()
{
Console.WriteLine("
我是第二个被点击的按钮!");
}
}

如果看这段代码没有感觉的话,试着写一写。

好了,看看微软是如何解决这个问题的吧。

Code
//
先声明一个委托再说,目标是要能调用ForCustome类里的方法,所以注意方法签名
public delegate void myDelegate();

 


public class Button
{
//
声明一个事件,和委托相关联
public event myDelegate ClickIt;

public void Click()
{
//
可以想象,这个方法是一个封装了之前我们想要的一大段条件判断语句的复合体
ClickIt();
}
}

 


class Program
{
static void
Main(string[] args)
{
ForCustome fc = new ForCustome();

 

//实例化一个button
Button btn = new Button();
//
这里,将按钮的事件和按钮事件对应的(将要触发的)方法相关联,相当于我们之前想象的注册
btn.ClickIt += new myDelegate(fc.Button_Click);
btn.Click();

 

//实例化第二个button
Button btn2 = new Button();
btn2.ClickIt+=new myDelegate(fc.Button2_Click);
btn2.Click();   //
这样写能行么?
}
}

 

//这个类提供给用户的,没有变化
public class ForCustome
{
public void Button_Click()
{
//
用户在这里写具体的方法实现
Console.WriteLine("
被点击了!");
}

 

//添一个方法实现是必须的
public void Button2_Click()
{
Console.WriteLine("
我是第二个被点击的按钮!");
}
}

大功告成!欣赏一下吧,相当优雅的一个架构。而在WinformASP.NET中,给事件对应的方法添加了两个参数并规范了命名,就更完美了。看完这篇文章是不是有点乱,自己写的时候也是这种感觉,如果大家有什么不明白的地方可以到软晨学习网论坛里发贴,大家相互讨论,共同学习。