delegate 类型
若要使用一个delegate类型,并要动态地决定欲调用的方法,可以遵照下面的步骤来完成:
步骤一:声明delegate类型的函数样板。
步骤二:定义欲调用的方法。
步骤三:定义delegate类型处理函数,使用delegate。
步骤四:建立delegate类型实体,传入欲调用的方法名称。
步骤五:将程序代码链接起来运作。
在这个范例中,将在HumanResoruce类下建立两个方法aFunction与bFunction。并通过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 ;
}
}
}