理解C#中的代理和事件(二)

原创 2003年01月02日 09:19:00

理解C#中的代理和事件(二)

嗨!大家好,还记得刚才的那篇关于代理的吗?你是不是要问我为什么要分开来写?

原因很简单他们说要7篇以上才可以成为专题作家.噢,天啊,事实上这是我的第九篇


可是那两篇.还在审核中.开玩笑的,事实上是,结构,代理和事件有联系,可是也是可以

分开来讨论的两个话题.这就是我为什么要分开,因为,很多朋友一开始用到代理和事件

的时候,都是在给一个button或一个窗体添加事件的时候用到的.所以经常可以看到,有

人一提到代理和事件就会自然想到windows的时间驱动.是的那是最常用的,可是事实上

也是可以分开使用的,至少代理就是那样的.代理可以脱离事件来独立生存.上面的那一篇

正如你看到的那样.好吧,不多说了,让我们进入正题.

事件:

理解事件,这一点也不难,事实上,每个人每天都在经历着这样或那样的事件,然后组成了,你

的生活.想想,一个天气预报员通知你说明天要下雨了.很自然的,你会想到,你该代把伞.是的

这就是事件.天气预报发出这个事件通知,然后你来处理这个事件.你所做的就是带把伞来挡雨.

就象你常做的那样,你点击一个button然后发出click事件,接下来当然是处理这个事件了,也许是

弹出一个窗口,或别的什么事情这些都有可能发生,甚至是关闭计算机.这些都是用户事件.因为用户

触发GUI然后发生这些事件.

下面我们来看看C#中是如何处理的.那么我前面的那篇中曾提到过,把动词变成名词.你会想到什么?

是+ing吗?哈哈..开个玩笑,当然不是,我们不是在做英文联系.好吧,是代理,就象你常做的那样

在IDE环境中,你拖一个button到窗体上,然后双击它,你会看到什么?进入代码界面了吗?然后你就

来处理事件.可这和代理有什么关系?恩,你为什么不仔细找找看通常有怎么

this.button1.Click += new System.EventHandler(this.button1_Click);一句在你的
InitializeComponent()函数中.是的,这就是代理.它把事件放入了代理中.那么事件呢?

在this.button1_Click方法中你会看到它有两个参数,一个是object类型的sender,这个很简单

顾名思义它就是事件的发起人.它是谁,你只要问问它就知道了.那么第二个呢?是事件,对吗?

当然,发起人带着他的事件来了,就象天气预报员带着他的天气预报来了一样.好了,相信我

人类总有一天可以制造天气.听着一定要相信我,出了打雷下雨等这些上帝已经预定好的天气

我们总有一天会创造出新的天气效果例如,下钱怎么样?呵呵..听上去是个不错的想法,虽然是

个玩笑.好的,你会说我准是疯了,干嘛说这些?不,我要谈到一个新的话题.那就是用户自定义

事件和系统预定义事件.那么下面我们来分别讨论这两种事件.


用户自定义事件:

我相信代码永远都是最有说服力的.就象你不愿意去看教材而更愿意去看科教电影那样.

下面的代码,就是我要说明的事实.

 

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace userEvent
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public delegate void MYShow();

 public class Form1 : System.Windows.Forms.Form
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;
        public event MYShow ShowME;
  public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
                    this.ShowME();
  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows Form Designer generated code
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   //
   // Form1
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(292, 273);
   this.Name = "Form1";
   this.Text = "Form1";
            this.ShowME+=new MYShow(this.ShowMeName);
   
  }
  #endregion

  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }
  void ShowMeName()
  {
   MessageBox.Show("I'm yarshray");
  }
 }
}


看见上面的代码了吗?不用我多说,你也猜到我要说的是什么,看我自定义的一个代理

public delegate void MYShow(); 这个代理将要代理一个事件,它是在这儿定义的

如下:public event MYShow ShowME;我定义的这个事件的名字叫做ShowME是的,人如其名

就是要展示一下我,呵呵..,看看吧,下面的一句this.ShowME+=new MYShow(this.ShowMeName);

我使用了这个事件并把ShowMeName交给了他.这个方法很简单就是弹出一个对话框.写上我

的名字"yarshray",可是这这个事件是在那儿触发的呢?为什么不向上看?看见构造函数了吗?

是的,里面有一句 this.ShowME();,可是你知道,这样做没有任何意义,实际情况是需要自定义

消息然后把它掉到消息循环中,然后通过消息来触发事件.不过我只是在讲有关代理和事件,所以

并没有那么做.只为了图简便.让你能够看的更清楚.好了,用户自定义事件我就讲到这里.下面的

时间让我们来讲讲预定义事件.

 

预定义事件:

实际上不用我多说,大家都用到过.讲象我一开始说到的那样,天气预报员带着他的天气预报一样

那都是上帝预先安排好的那样,刮风下雨,下雪,冰雹等等.直接拿来使用就好了.就想一个按纽那样

点击.鼠标进入,鼠标移开,等等.例子我就不给了,谁都用过,


好了,我写完了,希望对你有点帮助,当然看上去,更象一堆废话,是吗?那好吧,你就当成是一种

消遣.最后还是谢谢各位能够看完.我还会写的.就这样,下回见.

c#的委托(代理)和事件

一、代理 首先我们要弄清代理是个什么东西。别让一串翻译过来的概念把大家搞晕了头。 有的文章把代理称委托、代表等,其实它们是一个东西,英文表述都是“Delegate”。由于没有一本权威的书来规范...
  • xiangxiang123123
  • xiangxiang123123
  • 2013年03月06日 13:18
  • 13360

理解C#中的代理和事件(一)

突然写这篇文章,真的有点,是在做作的感觉,我想这并不是什么,难以理解的东西,事实上,很多人都写过,而且,我保证至少不比我写的差.可是还是觉得有必要提出来.因为要去正确的理解代理和事件是很有趣的,也是很...
  • guan_jun
  • guan_jun
  • 2010年02月21日 19:58
  • 116

C#中的代理与事件(~精~) 收藏

(原创:http://hi.baidu.com/grayworm) 代理与事件是DotNet的两个重要概念,但好多朋友感觉没有这两个概念照样能够进行常规的DotNet开发。其实深入理解这两个概念对Do...
  • love_c2004
  • love_c2004
  • 2009年09月08日 17:14
  • 310

快速理解C#中的委托与事件

以下内容只是个人理解,仅供参考。 什么是委托? 先看最简单的委托例子: namespace DelegateTest { public delegate void MessageDele...
  • Wiiix
  • Wiiix
  • 2016年05月20日 20:02
  • 5612

理解C#中的代理和事件(一)

解C#中的代理和事件(一)  突然写这篇文章,真的有点,是在做作的感觉,我想这并不是什么,难以理解的东西,事实上,很多人都写过,而且,我保证至少不比我写的差.可是还是觉得有必要提出来.因为要去正确的理...
  • yarshray
  • yarshray
  • 2002年12月31日 09:35
  • 1167

C# 事件的简单理解

引用书中的一段话: 事件基于委托。为委托提供了一种发布订阅机制.从这句话来看,首先要有委托,然后有事件,发布事件,接着订阅事件.第一部分:最简单的例子 看第一个例子: class Prog...
  • gghome
  • gghome
  • 2016年03月30日 15:30
  • 753

在C#中使用代理的方式触发事件 (委托和事件 )

 事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理操作系统的各种事件。所谓事件就是由某个对象发出的消息。比如用户按下了某个按钮,某个文件...
  • maliang1225
  • maliang1225
  • 2007年07月18日 11:04
  • 2591

Unity3d C# 广播消息 事件代理与委托

广播与消息 函数原型: public void ReceiveBroadcastMessage (string methodName, object value); public v...
  • he_wen_jian
  • he_wen_jian
  • 2014年10月30日 19:46
  • 4558

C#委托与代理模式

在设计模式的学习过程中,委托是一个不容易理解的知识点。尤其是在学完代理模式之后,就更不知道什么是什么了。下面分别看一下各自的实例,来看一下这两者有什么区别。       委托是一种引用方法的类型。...
  • zc474235918
  • zc474235918
  • 2014年03月09日 11:13
  • 3417

C#2.0的泛型代理和事件 :以一当百的快感

今天用C#2.0的泛型改写了我的一个系统的消息实现,感觉非常不错,很简洁而且速度快了(MSDN上那么说的,暗示诱导使我也有此感觉,呵呵)。我们唠会儿嗑,回顾一下经典内容:.NET框架的消息模型,构建于...
  • uyi
  • uyi
  • 2006年03月12日 00:44
  • 3006
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解C#中的代理和事件(二)
举报原因:
原因补充:

(最多只允许输入30个字)