委托.事件.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两个属性。这样方便在触发这个事件的时候获取更多的信息。
    原文地址:https://www.cnblogs.com/TivonStone/p/1737032.html