以前在学.net的时候,总是搞不明白delegate和event的区别,也不知道这个是做什么的,今天在www.codeproject.com上看了一篇文章觉得有点明白了,赶紧做一个笔记,原文地址:
http://www.codeproject.com/csharp/delegate_bedtime.asp
A
delegate首先是一个class,当你建立一个delegate的实例的时候,你需要传入一个函数名作为这个delegate的构造函数的参数。这里需要注意的是,这个函数在声明的时候,声明是和delegate的声明是一样的,例如:
感觉老外的代码结构真的很清晰,虽然还是有点迷糊啦,不过比原来清楚多了,多看看的话,以后应该会慢慢明白的,呵呵
http://www.codeproject.com/csharp/delegate_bedtime.asp
A
Delegate
is a class. When you create an instance of it, you pass in the function name (as a parameter for the delegate's constructor) to which this delegate will refer.
delegate首先是一个class,当你建立一个delegate的实例的时候,你需要传入一个函数名作为这个delegate的构造函数的参数。这里需要注意的是,这个函数在声明的时候,声明是和delegate的声明是一样的,例如:
Delegate int SomeDelegate(string s, bool b);
private int SomeFunction(string str, bool bln){...}
SomeDelegate sd = new SomeDelegate(SomeFunction);
调用
sd("somestring", true);
这个就跟函数的指针类似。
Events are variables of type delegates.
I mean, if you want to declare an event,
you just declare a variable of type some delegate and
put event
keyword before your declaration, like this:
Events是delegate类型的变量,如果需要声明一个event,
就可以声明特定类型的delegate并且把event这个关键字放在声明前,例如:
public delegate void NumberReachedEventHandler(object sender,
NumberReachedEventArgs e);
public event NumberReachedEventHandler NumberReached;
完整的例子:
public class Counter
{
public event NumberReachedEventHandler NumberReached;
public Counter()
{
//
// TODO: Add constructor logic here
//
}
//在计数到reachableNum的时候,触发事件
public void CountTo(int countTo, int reachableNum)
{
if(countTo < reachableNum)
throw new ArgumentException(
"reachableNum should be less than countTo");
for(int ctr=0;ctr<=countTo;ctr++)
{
if(ctr == reachableNum)
{
NumberReachedEventArgs e = new NumberReachedEventArgs(
reachableNum);
OnNumberReached(e);
//可以在这里直接调用NumberReached(this, e),不过这样
//做的话,扩展性差一点
return;//don't count any more
}
}
}
//通过这种方式,子类继承的时候可以很容易的扩展,覆盖掉这个方法,做自己定义的处理
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
if(NumberReached != null)
{
NumberReached(this, e);//Raise the event
}
}
}
感觉老外的代码结构真的很清晰,虽然还是有点迷糊啦,不过比原来清楚多了,多看看的话,以后应该会慢慢明白的,呵呵
![](http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2094699737692983411&page=RSS%3A+.Net%E4%B8%AD%E7%9A%84Delegate%E5%92%8CEvent&referrer=)
![](https://i-blog.csdnimg.cn/blog_migrate/b9df75f2f5783ee372569ae9c8fea04b.gif)