您的位置:首页 > 编程语言 > C#

C#事件 委托 学习笔记

2012-12-05 17:22 267 查看
事件是种特殊的委托
分为:事件, 委托, 事件委托

其中事件和事件委托的参数一般是固定格式:(object sender, EventArgs e),
但是可以通过继承EventArgs类来改为自定义的参数。

1 事件实例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 事件2
{
public partial class Form1 : Form
{
private event EventHandler MyEvent; //1 声明一个事件

public Form1() //Form1构造函数
{
InitializeComponent();
MyEvent += new EventHandler(OnMyEvent); //3 添加事件处理
}

private void button1_Click(object sender, EventArgs e)
{
MyEvent(sender, null); //4 触发事件
}

public void OnMyEvent(object sender, EventArgs e) //2 事件处理函数, 参数固定格式
{
MessageBox.Show("OnMyEvent !");
}
}
}



步骤:
①声明一个事件: [修饰符] event EventHandler eventName;
注意:当是 事件委托 的时候,上句的EventHandler就要改为相应的委托名字,而事件委托对应的 委托 的“原型”以及对应的函数原型的参数就要为(object sender, EventArgs e)的形式(现阶段)。

②写一个事件处理函数
[修饰符] 返回值类型 FuncName(object sender, EventArgs e);
注意这里函数原型的参数!

③绑定事件和对应的事件处理函数
eventName += new EventHandler(FuncName);

④触发事件
eventName(sender, e);
这里的实参sender和e根据实际情况来。

---------------------------------------------------------------------------------------------
2 委托实例

委托非常类似于函数指针,当然这里的委托是安全的。

先来回顾一下函数指针:
int Function(int a, char b) //函数定义
{
//codes
return 0;
}

int (*PFunc)(int a, char b); //声明函数指针,返回值和参数和对应的函数一致

PFunc = Function; //函数指针赋值, 函数名即为地址(指针)
PFunc(1, 'a'); //调用函数指针

--------
委托:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 委托2
{
public partial class Form1 : Form
{
private delegate void MyDelegate(int a, char b); //1 声明一个委托

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
MyDelegate myd = new MyDelegate(OnMyDelegate); //3 定义一个委托对象myd
myd(10, 'c'); //4 调用
}

public void OnMyDelegate(int a, char b) //2 委托对应的函数
{
MessageBox.Show("OnMyDelegate !");
}
}
}



步骤:
①声明一个委托
[修饰符] delegate 返回值 DelegateName(参数s);
注意:上句里的 参数s 一定要和对应的函数一致(返回值, 参数个数,参数类型)

②定义委托函数
[修饰符] 返回值 FunctionName(参数s)
{
//codes
}

③创建委托对象
DelegateName dgObj = new DelegateName(FuncName);

④调用
dgObj(实参s);

---------------------------------------------------------------------------------------------

3 事件委托

需要注意的地方很多

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 事件委托3
{
public partial class Form1 : Form
{
private delegate void MyEventHandler(object sender, EventArgs e); //1 声明一个委托,注意 参数!
private event MyEventHandler MyEvent; //2 声明一个事件,注意MyEventHandler!

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
MyEvent += new MyEventHandler(OnMyEvent); //4 绑定事件 委托
MyEvent(sender, null); //5 调用委托
}

public void OnMyEvent(object sender, EventArgs e) //3 事件处理函数
{
MessageBox.Show("OnMyEvent !");
}

}
}

注意:
事件委托事件的不同之处:
声明事件时event后面“关键字”不一样,事件:event后面的EventHandler是个关键字,
而 事件委托:event后面的是声明的委托,即本例中下划线的MyEventHandler
相同的地方就是:对应的事件处理函数的参数都是(object sender, EventArgs e)



步骤:
①声明一个委托
[修饰符] delegate 返回值类型 DelegateNameEventHandler(object sender, EventArgs e);
注意:这里的委托对应的“函数原型”的参数就不和第二部分中的一样了,该委托的函数原型的参数必须为(object sender, EventArgs e), 当然只是现阶段,也就是没有考虑自定义参数之前这样是必须的。

②声明一个事件
[修饰符] event DelegateNameEventHandler eventName;
注意:event是个关键字

③定义一个事件处理函数
[修饰符] 返回值类型 OnDelegateName(object sender, EventArgs e)
{
//codes
}
注意:参数!!

④新建事件对象 并 绑定事件处理函数
eventName += new DelegateNameEventHandler(OnDelegateName);
注意:事件 和 事件委托的情况下 都是 +=, "+="用来表示加入事件队列,"-="表示从事件队列中拿走这个事件。

⑤触发事件
eventName(sender, e);
注意:这里的参数sender 和 e 根据实际情况来。

上述说的都是基于:没有使用事件自定义参数的请!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: