zoukankan      html  css  js  c++  java
  • 委托.事件.Lambda(2)

    在C#中,一个类可以有域(Fields)、属性(Properties)、方法(Methods)、索引(Indexs)、事件(Events)等成员,其中事件(Events)成员就是用来声明一个类事件的。在类中声明一个事件成员一般采用如下的语法形式:public event 代表名 事件名。


    1.一个简单的委托

    delegate int DelegateOperation(int i1, int i2);
    static void Main(string[] args)
    {
    DelegateOperation do1
    = new DelegateOperation(Add);
    Console.WriteLine(do1(
    100, 200));
    Console.ReadLine();
    }
    public static int Add(int m, int n)
    {
    return m + n;
    }

    根据委托的定义,我们可以知道这段代码的将结果。DelegateOperation-->Add(int m, int n)-->Add(100, 200)。就是这样的一个流程走下来。

     
    2.事件的实现过程

    private void button33_Click(object sender, EventArgs e)
    {
    delegateClass dc
    = new delegateClass();
    dc.RegisterOK
    += new delegateClass.DelegateRegisterOkEvent(s1_RegisterOK);
    dc.Register();
    }

    void s1_RegisterOK()
    {
    MessageBox.Show(
    "触发RegisterOK事件");
    }
    class delegateClass
    {
    public delegate void DelegateRegisterOkEvent();
    public event DelegateRegisterOkEvent RegisterOK;
    public void Register()
    {
    MessageBox.Show(
    "调用RegisterOK事件.");
    RegisterOK();
    }
    }

    下面的这段代码是一个还有委托和事件的类,上面的代码是放在main函数中的。dc.Register()-->RegisterOK()-->s1_RegisterOK-->("触发RegisterOK事件")。


    3.C#中预定义事件处理方式
     
    private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) {
    }
    this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);


    可能大家发现在C#中有些事件和前面的似乎不太一样。例如
           private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
           {
           }
           this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
         这里使用了KeyPressEventArgs而不是EventArgs作为参数。这里使用了KeyEventHandler委托,而不是EventHandler委托。
        KeyPressEventArgs是EventArgs的派生类,而KeyEventHandler的声明如下
           public delegate void KeyEventHandler( object sender , KeyEventArgs e ); 
        是参数为KeyEventArgs的委托。那为什么KeyPress事件要这么做呢,我们可以从两个类的构造函数来找答案。
           public EventArgs();
           public KeyPressEventArgs(char keyChar);
         这里的keyData是什么,是用来传递我们按下了哪个键的,哈。
         我在KeyEventArgs中又发现了属性
            public char KeyChar { get; }
         进一步证明了我的理论。下面我们来做一个类似的例子来帮助理解。
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fangyuan303687320/archive/2010/01/02/5122103.aspx
    可能大家发现在C#中有些事件和前面的似乎不太一样。 这里使用了KeyPressEventArgs而不是EventArgs作为参数。这里使用了KeyEventHandler委托,而不是EventHandler委托。KeyPressEventArgs是EventArgs的派生类,而KeyEventHandler的声明如下

    public delegate void KeyEventHandler( object sender , KeyEventArgs e );



    4.事件的参数的使用 

    如上面的例子所说:

    public class KeyPressEventArgs : EventArgs
    {
    // 摘要:
    // 初始化 System.Windows.Forms.KeyPressEventArgs 类的新实例。
    //
    // 参数:
    // keyChar:
    // 与用户按下的键相对应的 ASCII 字符。
    public KeyPressEventArgs(char keyChar);

    // 摘要:
    // 获取或设置一个值,该值指示是否处理过 System.Windows.Forms.Control.KeyPress 事件。
    //
    // 返回结果:
    // 如果处理过事件,则为 true;否则为 false。
    public bool Handled { get; set; }
    //
    // 摘要:
    // 获取或设置与按下的键对应的字符。
    //
    // 返回结果:
    // 撰写的 ASCII 字符。例如,如果用户按下 Shift + K,则该属性返回一个大写的 K。
    public char KeyChar { get; set; }
    }
    这里KeyPressEventArgs扩展了EventArgs。增加了HandledKeyChar两个属性。这样方便在触发这个事件的时候获取更多的信息。
    1. 相关阅读:
      mysql远程连接失败的解决方法(CentOS版)
      【lamp】搭建
      【wamp】WAMP配置与单IP多域名功能设置
      【centos】网卡自动联网
      stm32之keil开发环境搭建
      利用ffmpeg将H264流 解码为RGB 分类: VC++ ffmpeg-SDL-VLC-Live555 2015-08-07 11:39 155人阅读 评论(0) 收藏
      使用ffserver实现转发实时流媒体(摄像头捕获) 分类: TI-AM335X arm-linux-Ubuntu ffmpeg-SDL-VLC-Live555 2015-08-04 09:36 5人阅读 评论(0) 收藏
      ffmpeg+ffserver搭建流媒体服务器 分类: arm-linux-Ubuntu ffmpeg-SDL-VLC-Live555 TI-AM335X 2015-08-04 09:35 6人阅读 评论(0) 收藏
      嵌入式linux------ffmpeg移植 编码H264(am335x编码H264) 分类: TI-AM335X ffmpeg-SDL-VLC-Live555 arm-linux-Ubuntu 2015-08-04 09:34 5人阅读 评论(0) 收藏
      嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示) 分类: arm-linux-Ubuntu TI-AM335X ffmpeg-SDL-VLC-Live555 2015-07-29 10:28 154人阅读 评论(0) 收藏
    2. 原文地址:https://www.cnblogs.com/TivonStone/p/1737032.html
    Copyright © 2011-2022 走看看