委托允许内存中的对象进行双向对话。从头使用委托会有一些重复代码(定义委托,声明必要的成员变量记忆创建自定义的注册/注销方法来保护封装等)
除了时间之外,这样使用委托来作为应用程序的回调机制会有另一个问题:如果没有把委托成员变量定义为私有的,调用者就可以直接访问委托对象。这样调用者就可以把变量重新赋值为新的委托对象(实际上,也就是删除了当前要调用的方法列表),更糟糕的是,调用者可以直接调用委托的调用列表。
公共的委托成员打破了封装,不仅会导致代码难以维护和调试,还会导致应用程序的安全风险。
namespace SimpleCarDelegate
{
internal class Car
{
public delegate void CarEngineHandler(string msgForCaller);
//
public CarEngineHandler listOfHandlers;
//
public void Accelerate(int delta)
{
if (listOfHandlers != null)
listOfHandlers("Sorry ,This Car is dead……");
}
}
class Program
{
static void Main(string[] args)
{
Car myCar = new Car();
myCar.listOfHandlers = new Car.CarEngineHandler(CallWhenExploded);
myCar.Accelerate(10);
myCar.listOfHandlers = new Car.CarEngineHandler(CallHereToo);
myCar.Accelerate(10);
myCar .listOfHandlers.Invoke("QQQQQQQQQQQQQQQQQ");
Console.ReadLine();
}
static void CallWhenExploded(string msg)
{
Console.WriteLine(msg);
}
static void CallHereToo(string msg)
{
Console.WriteLine(msg);
}
}
}