看了一些资料,有些讲的太术语话,在委托和事件转来转去中,按我个人的理解,把他描述一遍,可能不够准确。
委托就好像将一个很他形状一样的函数装进他里面去,当出项很多函数函数签名,参数一样时,就可以使用委托来决定使用哪个函数,我把他看做是一个类中类或是对象中对象这样子。
比如 public delegate void message(connection sender,messageArg e);
可以通过 _message=new message(某个函数名)来调用某个函数
使用时 就_message(参数名)来使用
事件,我今天想了一下 ,什么时候会使用事件,按下某个按钮就会发生反应时最典型的事件了,如果换其他场景,我们自定义事件的话,跟使用线程和标准的函数应用应该只是异曲同工吧。
不说了,看委托和事件如何结合吧。
先声明一个委托,因为事件的应用要和位图绑定在一起,所以先把老大找出来。public delegate void message(connection sender,messageArg e);
在以这个声明为基础,个人可以认为他是类。然后声明一个事件,关键字event说明他是事件,public event message messageA;
将二者绑定起来messageA += new message(mc.display);
产生一个事件messageA(this,new messageArg("test"));
三部曲完成委托与事件的结合使用,以下是具体的例子。
namespace Test
{
public class messageArg:EventArgs
{
private string m;
public string M {
get {
return m;
}
set {
m = value;
}
}
public messageArg() {
m = null;
}
public messageArg(string s)
{
m = s;
}
}
namespace Test
{
public delegate void message(connection sender,messageArg e);
public class connection
{
public event message messageA;
private string name;
public string Name {
get {
return name;
}
set {
name = value;
}
}
public connection() {
name = null;
}
public connection(string s) {
name = s;
}
public void run() {
messageA(this,new messageArg("test"));
}
public void display(connection c, messageArg e) {
Console.WriteLine("the name of this object is {0},the message is {1}",c.Name,e.M);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
connection mc = new connection("first");
connection mmc=new connection("second");
mc.messageA += new message(mc.display);//将委托与事件绑定起来
mc.run();//产生一个事件
mmc.messageA += new message(mmc.display);
mmc.run();
}
}
}
你会发现display这个函数所需要的东西,和run这个函数产生的事件是紧密结合,可以找得到答案的,这就是所谓的绑定吧。顺便说一下,是因为他们都在同个对象才用this的吧,个人看法,客观看待。