Delegate/event 的简单理解

为什么要有Delegate?

假设有两个不同类实现的对象A和B,A和B分别有方法a和b。现在需要a方法以一触发,便执行对象B的方法b。

不使用delegate,我们可以在设计A类的时候在将B类作为参数传入a方法,这样可以实现我们的要求。但是这样做有明显的缺陷:

  1. 我们需要事先知道B类。

  2. 如果还存在C类、D类等的方法需要一并执行,这样必须重新修改A类的代码。

如果有了Delegate,我们可以事先设计一个函数指针,这样当对象A执行a方法的时候,就可以根据该指针指向的,符合该函数指针法则的方法进行执行。这样,我们就不需要在设计A类的时候知道B类,只需要知道B的b方法的参数和返回值就可以了。如果还有C类、D类方法需要一并执行,也可以添加到该指针指向的数据结构中。

 

示例代码分析:

  

代码
class Program
{
static void Main(string[] args)
{
A a
= new A();
B b
= new B(a);
a.Method_A();
}
}


class A
{
public delegate void Delegate_A();
public event Delegate_A da;
public void Method_A()
{
da();
}
}

class B
{
public B(A a)
{
a.da
+= new A.Delegate_A(Method_B);
}
public void Method_B()
{
Console.WriteLine(
"B's method!");
}
}

1. 先看Class A中

  public delegate void Delegate_A(); 这个语句规定了函数指针指向的函数应该符合的规范:没有返回值,没有参数传入。

2. 接着实例化了一个 Delegate_A的对象da,这里使用event关键字表明它是一个事件。

3. 再看Class B的的构造函数,可见B构造时,往对象a的事件中传入了Method_B的函数地址(a.da += new A.Delegate_A(Method_B)

4. 在Main函数中执行A对象的Method_A时,触发了事件da,而da指向了B的方法。这样即便A对象对B对象一无所知,也同样能执行B的方法Method_B。这就是Delegate的好处。

 

Event有什么用:

实际上在上例中将Event关键字删除程序同样能执行。之所以要加上Event,是因为在程序编译时,加上Event以后该Delegate的对象会成为该类的私有成员,这样外界只能通过 += 和 -=来对Delegate的对象da进行操作,而不能直接进行赋值。

posted on 2011-01-11 16:12  李志鹏  阅读(486)  评论(0编辑  收藏  举报

导航