您的位置:首页 > 编程语言 > C#

从C#与Net4高级编程复制来的——委托注意事项

2013-11-20 16:56 323 查看
委托允许内存中的对象进行双向对话。从头使用委托会有一些重复代码(定义委托,声明必要的成员变量记忆创建自定义的注册/注销方法来保护封装等)
除了时间之外,这样使用委托来作为应用程序的回调机制会有另一个问题:如果没有把委托成员变量定义为私有的,调用者就可以直接访问委托对象。这样调用者就可以把变量重新赋值为新的委托对象(实际上,也就是删除了当前要调用的方法列表),更糟糕的是,调用者可以直接调用委托的调用列表。
公共的委托成员打破了封装,不仅会导致代码难以维护和调试,还会导致应用程序的安全风险。
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);
        }
    }
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: