日期:2014-05-16  浏览次数:21009 次

C#(三)-听说委托“不简单”

    又到了一月一度的月底交话费时间了,广大的手机用户们表示无比惆怅,移动公司表示无比欢欣。

    这不,放血坐拥“土豪金”的菜鸟程序员小丁由于白天业务繁忙、晚上娱乐至上,手机费也如“滚滚长江东逝水”般被“浪花”淘尽了。无奈工资未发,急也白瞎,只能苦苦哀求同租在一间公寓里的舍友小杨先给“垫点儿”。

    于是乎,委托就来了~~~

    委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托可以看做是对函数的抽象,是函数的“类”,委托的实例代表一个具体的函数,可以像其他任何方法一样具有参数和返回值。(哭委托不简单!)

    如果把委托看成一种数据类型的话,那么它所能接收的数值只能是一个函数的地址。

    乍一看,说的云遮雾绕的。翻译成“小丁的故事”就是:小丁手机欠费了,“某个函数”通知小杨先替他交点儿。

    PS:看看委托多简单!(疑问作者你说的是真的么……)

    下面看这个例子的代码。奋斗

    

namespace 委托例子
{
    class Program
    {
        static void Main(string[] args)
        {
            Ding xiaoding = new Ding("小丁");  //实例化xiaoding
            Yang xiaoyang = new Yang("小杨");  //实例化xiaoyang

            xiaoding.需充值100元 += new Ding.小丁欠费(xiaoyang.交话费);  //把小杨的“交话费”方法通过实例化委托“小丁欠费”登记到小丁的“需充值100元”事件中。“+=”表示“add_需充值100元”。
            xiaoding.急需交费();
        }                                                              

    }
    class Ding      //小丁类
    {
        private string name;     //声明名字私有变量
        public Ding(string name)  //传入小丁的名字
        {
            this.name = name;
        }
        public delegate void 小丁欠费();   //声明一个委托"小丁欠费"
        public event 小丁欠费 需充值100元;   //声明事件“需充值100元”,事件类型为委托“小丁欠费”

        public void 急需交费()  //急需交费的方法
        {
            Console.WriteLine("真不幸,我是{0},手机欠费了",name );

            if (需充值100元 != null)   //在执行急需交费方法时,如果“需充值100元”委托中有对象登记事件,则执行“需充值100元”方法
            {
                需充值100元();
            }
        }
    }
    class Yang       //小杨类
    {
        private string name;
        public Yang (string name)
        {
            this.name=name;
        }
        public void 交话费()
        {
            Console.WriteLine("我是{0},我来给你交话费", name);
        }

    }
}

     输出:真不幸,我是小丁,手机欠费了

          我是小杨,我来给你交话费

     仔细看看,发现委托原来真的不难。大笑

    

     在上面的例子中,委托只搭载了一个方法“需要交话费”。实际上,一个委托可以搭载多个方法,所有的方法会被依次唤起,而且委托对象所搭载的方法不需要属于同一个类。

     但是!委托的前提是所搭载的所有方法必须有相同的原型和形式,也就是拥有相同的参数列表和返回值类型。

    

     总结:委托是设计模式中“观察者模式”的产物,应用好委托能大大降低类之间的耦合度,相当于第三方的作用。委托除解耦思想外,最独特的地方就是它的接收函数