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. 相关阅读:
      14.18 InnoDB Backup and Recovery 备份和恢复:
      14.18 InnoDB Backup and Recovery 备份和恢复:
      php使用 _before_index() 来实现访问页面前,判断登录
      php使用 _before_index() 来实现访问页面前,判断登录
      查询方式实例演示
      查询方式实例演示
      haproxy timeout server 46000 后台超时时间
      haproxy timeout server 46000 后台超时时间
      14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
      14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
    2. 原文地址:https://www.cnblogs.com/TivonStone/p/1737032.html
    Copyright © 2011-2022 走看看