delegate类型

来源:互联网 发布:腾讯网络加速器内测版 编辑:程序博客网 时间:2024/05/07 18:05

delegate 类型

若要使用一个delegate类型,并要动态地决定欲调用的方法,可以遵照下面的步骤来完成:

步骤一:声明delegate类型的函数样板。

步骤二:定义欲调用的方法。

步骤三:定义delegate类型处理函数,使用delegate

步骤四:建立delegate类型实体,传入欲调用的方法名称。

步骤五:将程序代码链接起来运作。

在这个范例中,将在HumanResoruce类下建立两个方法aFunctionbFunction。并通过delegate类型,动态地调用这两个方法。

delegate程序代码列表

using System;

namespace UCOM.HR

{

     public delegate string FunctionPoiter(string Name);

     public class HumanResource

     {

         public static string aFunction(string Name)

         {

              return "A Say Hello To " +Name;

         }

         public static string bFunction(string Name)

         {

              return "B Say Hello To " +Name;

         }

         public static void aMethod(FunctionPointer aFunctionPointer)

         {

              Console.WriteLine(aFunctionPointer("Miles"));

 

         }

         public static int Main()

         {

              FunctionPointer a = new FunctionPointer(aFunction);

              FunctionPointer b = new FunctionPointer(bFunction);

              aMethod(a);

              aMethod(b);

         }

     }

}

 

delegate事件

事件(Event)就是一个回呼(callbak)的函数指针(Function Pointer),C#中通过delegate达成。

事件有两个角色:

事件发行者(Publisher):也称传送者(Sender),其实就是一个对象,这个对象会自行维护本身的状态信息。当本身的状态信息变动时,便触发一个事件,并通知所有的事件订阅者。

事件订阅者(Subscriber):对事件感兴趣的对象,也称为接收者(Receiver),可以注册感兴趣的事件处理常式,在事件发行者触发一个事件后,会自动执行这段程序代码的内容。

事件范例

范例中包含两个类,一为Employee类,一为HumaneRsource类。

程序清单

using System;

namespace UCOM.HR

{

     public delegate void ComputeSalaryCallback(string EmpID,double Salary);

     public class Employee

     {

         public event ComputerSalaryCallback OnComputeSalaryDone;

         ...

         public Employee(string EmpID,double BaseSalary)

         {

              mstrEmpID = EmpID;

              mdblBaseSalary = BaseSalary;

         }

         public virtual double ComputeSalary()

         {

              OnComputeSalaryDone(mstrEmpID,mdblBaseSalary);

              return mdblBaseSalary;

         }

         ...

     }

     public class HumanResource()

     {

         public static void SalaryHandler(string EmpID,double Salary)

         {

              Console.WriteLine("员工:员工代号={0}。薪资={1}",EmpID,Salary);

         }

         public static int Main()

         {

              Employee e1 = new Employee("001",5000);

              e1.OnComputeSalaryDone +=new ComputeSalaryCallback(SalaryHandler);

              e1.ComputeSalary();

              return 0 ;

         }

     }

}

原创粉丝点击