C#中的方法(函数),委托和事件

1. 先有方法,然后再有委托,最后再有事件

2. 思考能不能将 A方法 作为参数,传递给 B方法呢?

    eg: 在传统的编程方式中,A方法 调用 B方法的方式如下:

//洗菜
public void Washing(string vegetables){
     Console.WriteLine("清洗"+ vegetables);
}

//做家务
public void DoingHousework( ){
    //洗菜..
Washing("土豆");//直接调用 }

      能不能像vegetables作为Washing()的参数那样,来实现

      DoingHousework()调用Washing()呢,那代码应该怎么写呢,

//洗菜 
public void Washing(string vegetables){
Console.WriteLine("清洗"+ vegetables);
} /* 能不能将Washing()作为参数, 传递给DoingHousework()呢 */ //做家务 public void DoingHousework( ){//貌似以前没怎么听说过,可以将方法作为另一个方法的参数哦,那这个参数的类型应该是 //洗菜.. }

      貌似以前没怎么听说过,可以将方法作为另一个方法的参数哦,那这个参数的类型应该是 没错就是委托

3. 委托 delegate(方法的类型):

          类似于C/C++中的函数指针

    委托的声明:

    public delegate void HouseworkDelegate(string str);

    注意:

            delegate:是委托的关键字,由上面委托的声明可以看出,它除了多了delegate关键字,其他部分跟方法的声明完全一样

     那么上面的例子使用委托后,应该改为:

//声明委托
public delegate void HouseworkDelegate(string str);

//洗菜
public void Washing(string vegetables){
     Console.WriteLine("清洗"+ vegetables);
}

//DoingHousework()拥有一个HouseworkDelegate类型的参数
public void DoingHousework(HouseworkDelegate houseworkDelegate){
    //洗菜
    houseworkDelegate("西红柿");
}

   更多委托相关的信息,可以查看另一篇博客:C#中的委托 Delegate(委托 也叫代表,代表一类方法)

 

4. 事件 event:

        如果说 委托 是对方法的抽象(其实是方法的类型);那么事件 则是在委托的基础上 进行了一些特殊的处理,加工

        所以 事件 本质还是委托。

    4.1. 事件的声明:

          public event HousewordDelegate housewordEvent;

          注意:

            event:是事件的关键字, event后面紧接的是 委托的类型 HousewordDelegate,

                     所以声明事件之前,必须先声明事件所要使用的Delegate,由声明更可以看出,事件就是加工过后的委托!!

         

           借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误:

 

           public event GreetingDelegate MakeGreet;

 

         

 

 

5. 总结:

       委托,事件,归根到底其实就是对方法的加工和特殊处理后的产物。

更多内容,请查看:http://www.tracefact.net/csharp-programming/delegates-and-events-in-csharp.aspx   

    

posted @ 2015-10-11 15:29  一菲聪天  阅读(2051)  评论(0编辑  收藏  举报