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. 相关阅读:
      suse linux 下的 altera 软件 安装。
      全国教育网DNS(转)
      Upan量产 金士顿 G3
      备忘一 wget
      Linux IP 设置方法
      Linux 如何 mount 挂载 iso 虚拟光驱
      安卓学习资料总结
      自己实现的一个Android上面TreeView效果
      Android 学习资料推荐
      Android ListView下拉刷新 Demo
    2. 原文地址:https://www.cnblogs.com/TivonStone/p/1737032.html
    Copyright © 2011-2022 走看看