天下無雙
阿龍 --质量是流程决定的。

.NET中所谓的事件Event和委托(新手看看就行了)

不少书中喜欢把委托和事件放到一个高度上来讲述,这就造成了初学者会对这两者关系产生疑惑,委托和事件似乎没什么区别。

其实.net中的事件就是微软提供给我的语法糖,目的是为了减少代码量,其实事件的相关功能都能用委托做出来。

 


    public class Person
    {
        
public delegate void PersonWorkHandle(string msg);

        
public event PersonWorkHandle WorkEnd;

        
public void DoWork()
        {
            WorkEnd(
"Person中我的工作完成了");
        }
    }

    
public class Person1
    {
        
public delegate void PersonWorkHandle(string msg);

        
private PersonWorkHandle WorkEnd;

        
public void add_WorkEnd(PersonWorkHandle value)
        {
            WorkEnd 
+= value;
        }

        
public void remove_WorkEnd(PersonWorkHandle value)
        {
            WorkEnd 
-= value;
        }

        
public void DoWork()
        {
            WorkEnd(
"Person1中我的工作完成了");
        }
    }

    
class Program
    {
        
static void Main(string[] args)
        {
            
//直接使用事件
            Person p = new Person();
            p.WorkEnd 
+= WorkEndHandle;
            p.DoWork();

            
//委托模拟事件
            Person1 p1 = new Person1();
            p1.add_WorkEnd(WorkEndHandle);
            p1.DoWork();

            Console.ReadLine();
        }

        
static void WorkEndHandle(string msg)
        {
            Console.WriteLine(msg);
        }
    }

 

Person中采用的是触发事件来通知调用者,我的工作做完了. WorkEnd就是事件

Person1中没用事件,纯粹的委托方法,完全达到了事件的目的.

如果你用IL 反汇编程序看下生成的代码 你会发现我Person和Person1中的代码是类似的

实际上我的Person1就是模拟了CLR自动生成的委托代码,你在Person看到那个WorkEnd事件,在被编译的时候就是自动生成了私有变量委托,和add_ remove_ 方法

采用事件写的代码 减少了代码量 好处就是这个 比如这里的


        private PersonWorkHandle WorkEnd;

        
public void add_WorkEnd(PersonWorkHandle value)
        {
            WorkEnd 
+= value;
        }

        
public void remove_WorkEnd(PersonWorkHandle value)
        {
            WorkEnd 
-= value;
        }

用一句

public event PersonWorkHandle WorkEnd;

就能代替

 

另外注册事件处理程序的时候可以很方便的用+=运算符

 

总之,事件就是委托的一个特殊应用罢了,没什么神秘的地方

posted on 2009-07-02 17:15  阿龍  阅读(191)  评论(0编辑  收藏  举报