您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > C# > 正文
深入解析C#编程中的事件
[文章信息]
作者:天宇
时间:2004-02-20
出处:yesky
责任编辑:方舟
[文章导读]
本文详细解释了C#编程中如何处理事件
advertisement
热点推荐
· 11.10软件精选 FW实用设计
· IE最新安全漏洞补救几大措施
· M牛的网络生活之下载篇
· Norton Ghost 9.0全新体验
· InstallShield简明使用教程之前言
[正文]

1 2 3  下一页

天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。


  一个事件是一个使对象或类可以提供公告的成员。用户可以通过提供事件句柄来为事件添加可执行代码。事件使用事件声明来声明:

  一个事件声明既可以是一个事件域声明也可以是事件属性声明。在每种情况中,声明都可以由属性集合, new 修饰符, 四个访问修饰符的有效组合 和一个静态修饰符组成。

  一个事件声明的类型必须是一个代表类型, 而那个代表类型必须至少同事件本身一样可访问。

  一个事件域声明与一个声明了一个或多个代表类型域的域声明相应。在一个事件域声明中不允许有readonly 修饰符。

  一个事件属性声明与声明了一个代表类型属性的属性声明相应。除了同时包含get访问符和set访问符的事件属性声明,成员名称和访问符声明对于那些属性声明来说都是相同的,并且不允许包含virtual、 override和abstract 修饰符。

  在包含一个事件成员声明的类或结构的程序文字中,事件成员与代表类型的私有域或属性相关,而这个成员可以用于任何允许使用域或属性的上下文中。

  如果一个类或结构的程序文字外面包含一个事件成员声明,这个事件成员就只能被作为+= 和 -= 操作符 (§的右手操作数使用。这些操作符被用来为事件成员附加或去掉事件句柄,而这个事件成员的访问操作符控制操作在其中被执行的上下文。

  由于+= 和 -= 是唯一可以在声明了事件成员的类型外的事件上使用的操作,外部代码可以为一个事件添加或去掉句柄,但是不能通过任何其他途径获得或修改基本事件域或事件属性的数值。

  在例子中

public delegate void EventHandler(object sender, Event e);
public class Button: Control
{
 public event EventHandler Click;
 protected void OnClick(Event e) {
  if (Click != null) Click(this, e);
 }
 public void Reset() {
  Click = null;
 }
}

  对使用Button类中的Click事件域没有限制。作为演示的例子,这个域可以在代表调用表达式中被检验、修改和使用。类Button中的OnClick方法"引起"Click事件。引起一个事件的概念与调用由事件成员表示的代表正好相同-因此,对于引起事件没有特殊的语言构造。注意代表的调用是通过检查保证代表是非空后才进行的。

  在类Button的声明外面,成员Click只能被用在+= 和 -= 操作符右手边,如下

b.Click += new EventHandler(...);

  它把一个代表附加到事件Click的调用列表中,并且

b.Click -= new EventHandler(...);

  它把一个代表从Click事件的调用列表中删除。

  在一个形式为x += y 或 x -= y的操作中,当x是一个事件成员而引用在包含x的声明的类型外面发生时,操作的结果就是void(在赋值后与x的数值相反)。这个规则禁止外部代码直接检查事件成员的基本代表。
下面的例子介绍了事件句柄如何附加到上面的类Button的实例中:

public class LoginDialog: Form
{
 Button OkButton;
 Button CancelButton;
 public LoginDialog() {
  OkButton = new Button(...);
  OkButton.Click += new EventHandler(OkButtonClick);
  CancelButton = new Button(...);
  CancelButton.Click += new EventHandler(CancelButtonClick);
 }
 void OkButtonClick(object sender, Event e) {
  // Handle OkButton.Click event
 }
 void CancelButtonClick(object sender, Event e) {
  // Handle CancelButton.Click event
 }
}

  这里,构造函数LoginDialog创建了两个Button实例,并且把事件句柄附加到事件Click中。

  事件成员是典型域,就像上面的Button例子中所示。在每个事件消耗一个域存储的情况是不可接受的,一个类可以声明事件属性来替代事件域,并且使用私有机制来存储基本的代表。(设想在某种情况下,大多数事件都是未处理的,每个事件使用一个域就不能被接受。使用属性而不是域的能力允许开发人员在空间和时间上面取得一个折中方案。)

  在例子中

class Control: Component
{
 // Unique keys for events
 static readonly object mouseDownEventKey = new object();
 static readonly object mouseUpEventKey = new object();
 // Return event handler associated with key
 protected Delegate GetEventHandler(object key) {...}
 // Set event handler associated with key
 protected void SetEventHandler(object key, Delegate handler) {...}
 // MouseDown event property
 public event MouseEventHandler MouseDown {
  get {
   return (MouseEventHandler)GetEventHandler(mouseDownEventKey);
  }
  set {
   SetEventHandler(mouseDownEventKey, value);
  }
 }
 // MouseUp event property
 public event MouseEventHandler MouseUp {
  get {
   return (MouseEventHandler)GetEventHandler(mouseUpEventKey);
  }
  set {
   SetEventHandler(mouseUpEventKey, value);
  }
}
}

  类Control为事件提供了一种内部存储机制。方法SetEventHandler用一个key来与代表数值相关,而方法GetEventHandler返回与key相关的当前代表。大概基本的存储机制是按照把空代表类型与key相关不会有消耗而设计的,因此无句柄的事件不占用存储空间。


1 2 3  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • VC# .Net中使用Crystal Report
  • C#中的非安全编程
  • 利用Visual C#处理数字图像
  • 利用C#实现分布式数据库查询
  • 用C#开发网络防火墙技术分析
  • 基于C#的接口基础教程之一
  • 基于C#的接口基础教程之二
  • 基于C#的接口基础教程之三
  • 基于C#的接口基础教程之四
  • 基于C#的接口基础教程之五
  • 基于C#的接口基础教程之七
  • 基于C#的接口基础教程之六
  • C#中构造函数和析构函数的用法
  • 用Visual C#实现P2P应用程序
  • 用Visual C#实现网络封包监视
  • Visual C#建立简单消息传递系统
  • VIA驱动问题导致DVD刻录失败
  • [配置推荐]学生型闪龙配置
  • 11.10软件精选 FW实用设计
  • 精英主板全面迈进P5时代
  • 详解11月三大硬件杀手游戏及四大凶器
  • 选硬盘 用好希捷互动存储专家
  • NDS十大最受期待游戏
  • 中国星际个人联赛第6轮综述
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索