委托和事件学习

来源:互联网 发布:新版php卡盟排行榜源码 编辑:程序博客网 时间:2024/05/22 10:24

(一)委托:

1、委托是一种特殊的数据类型,用于引用方法;

2、委托可以将方法当作另一个方法的参数进行传递;

3、使用委托的 好处在于可以简化多线程编程的难度;

4、委托是一种类的成员。


以下是相关代码,仅供学习:

例一:

using System;namespace lesson01{public delegate void Something (string name);    //声明委托—访问修饰符 delegate 返回值类型 委托名 (参数列表)public class Student{    public void Do (Something something){               something (name);                   //可以像普通方法、普通类型一样当做方法传递参数 }public Student (string name) {         this.name = name;   }       private string name;   }  public class Teacher {    public void Hungry (){                Student s = new Student ("苏利文");   Something a = new Something (A);             //创建委托变量              s.Do  (a);                }          public void A (string name){                 Console.WriteLine ("Hello,"+name);          }  }     class MainClass  {     public static void Main ( string[] args ) {       Teacher t = new Teacher () ;          t.Hungry () ;        }      }}


例二:

using System;namespace lesson01{//1、声明委托—访问修饰符 delegate 返回值类型 委托名 (参数列表)     public delegate int Calculator (int a, int b);   class MainClass  {     //2、根据委托定义一个具体的方法    static int Add (int a, int b){        return a+b;  }static int Sub (int a, int b){        return a-b;  }public static void Main ( string[] args ) {   //3、创建委托对象,关联具体方法       Calculator objCal = new Calculator (Add);  //4、通过委托调用方法,而非直接调用       int result = objCal (10,20);       Console.WriteLine ("10 + 20 = {0}",result);     objCal -= Add;                //-表示将委托变量代表的具体方法解绑             objCal += Sub;                //+表示重新指向一个新的方法绑定    result = objCal(10,20);    Console.WriteLine ("10 - 20 = {0}",result);    Console.ReadLine ();            }   }


(二)事件:

1、event和delegate的关系可以看成是字段和属性的关系;

2、事件弥补了委托无法封装的缺点,即想要深入理解事件,那么对于委托的理解一定要深刻;

3、事件处理顺序:定义事件、订阅事件、引发事件;

4、事件借助委托来实现。


以下是相关代码,仅供学习:


using System;    namespace Lesson01{            public delegate void Something (string name);         public class Student{                         public event Something something;             //使用event关键字调用委托               public void Do () {                                    something (name) ;                             }                       public Student (string name){                                 this.name = name;                     }                   private string name;        }          public class Teacher      {                     public void Hungry ()           {                               Student s = new Student ("苏利文") ;                       s.something += new Something (A);     //使用 event 后不能直接给委托赋值,必须使用+=绑定、-=解除绑定                    s.Do  ();                             //使用 event 后不能够在Student外调用委托 ,即限定了delegate只能在定义的类中被调用                         }                    public void A (string name){                               Console.WriteLine ("Hello,"+name);                  }         }            class MainClass {                         public static void Main ( string[] args ){                               Teacher t = new Teacher () ;                         t.Hungry () ;                 }            }  }  
原创粉丝点击