委托初步学习

来源:互联网 发布:软件行业协会会员费 编辑:程序博客网 时间:2024/04/28 05:07

//从第一个方法看到第9个方法, 看完就差不多了.

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate
{
    //定义委托, 它定义了可以代表的方法的类型
    public delegate void GreetingDelegate(string name);

    class P2
    {
        public GreetingDelegate gd3;
        public event GreetingDelegate gd4;

        //注意此方法, 它接受一个GreetingDelegate类型的方法作为参数
        public void GreetPeople(string name, GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }
    }

    class Program
    {
        private static void EnglishGreeting(string name)
        {
            Console.WriteLine("Morning, "+name);
        }

        private static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好, " + name);
        }

        //注意此方法, 它接受一个GreetingDelegate类型的方法作为参数
        private static void GreetPeople(string name,GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }

        static void Main(string[] args)
        {
            //Method1();
            //Method2();
            //Method3();
            //Method4();
            //Method5();
            //Method6();
            //Method7();
            //Method8();

            Method9();
            Console.ReadKey();
        }
        ///
        /// 9.事件也没有什么了不起的, 它是封装之后的委托类型的变量
        ///   不过, 它只能在+=或-=的左边, 也不能直接调用
        ///
        private static void Method9()
        {
            P2 p = new P2();
            //这是是错误的,p.gd4只能出现在+=或-=的左边p.gd4 = new GreetingDelegate(EnglishGreeting);
            p.gd4 += ChineseGreeting;
            //同时的错误: p.GreetPeople("Jack", p.gd4);
        }
        ///
        /// 8.将委托封装在P2这个类里
        /// 注意:此时的委托, 如是private,则外部无法访问, 如是public,则外部的赋值又可以随意赋值了.
        ///
        private static void Method8()
        {
            P2 p = new P2();
            p.gd3 = new GreetingDelegate(EnglishGreeting);
            p.gd3 += ChineseGreeting;
            p.GreetPeople("Jack", p.gd3);
        }
        ///
        /// 7.一般来说, GreetPeople和EnglishGreeting,ChineseGreeting不在一个类中.
        ///
        private static void Method7()
        {
            GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
            gd1 += ChineseGreeting;
            P2 p = new P2();
            p.GreetPeople("Jack", gd1);
        }
        ///
        /// 6.可以取消其中的一个方法
        ///
        private static void Method6()
        {
            GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
            gd1 += ChineseGreeting;
            Console.WriteLine("绑定了两个方法!");
            GreetPeople("Jack", gd1);
            Console.WriteLine("取消了其中的一个方法");
            gd1 -= ChineseGreeting;
            GreetPeople("Jack", gd1);
        }
        ///
        /// 5.可以像类一样直接得到对象, 但是GreetingDelegate gd1=new GreetingDelegate();却是错误的;
        ///
        private static void Method5()
        {
            GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
            //错误的: GreetingDelegate gd2= new GreetingDelegate();
            gd1 += ChineseGreeting;
            gd1("Jack");
        }
        ///
        /// 4.可以不用那个中转的方法, 直接调用委托
        ///
        private static void Method4()
        {
            GreetingDelegate gd1 = EnglishGreeting;
            gd1 += ChineseGreeting;
            gd1("Jack");
        }
        ///
        /// 3.委托最奇妙的地方: 一个委托类型的变量可以绑定多个方法, 调用委托时, 会依次调用这些方法
        /// 注意:第一次是赋值的语法, 第二次是绑定的语法, 如果第一次就用+=, 则会出现"无效的表达式项"的编译错误
        ///
        private static void Method3()
        {
            GreetingDelegate gd1 = EnglishGreeting;
            gd1 += ChineseGreeting;
            GreetPeople("Jack", gd1);
        }
        ///
        /// 2.既然委托定义了方法, 所以委托也可以接受方法的赋值
        ///
        private static void Method2()
        {
            GreetingDelegate gd1 = EnglishGreeting;
            GreetingDelegate gd2 = ChineseGreeting;

            GreetPeople("Jack", gd1);
            GreetPeople("老王", gd2);
        }
        ///
        /// 1.最简单的调用方式
        ///
        private static void Method1()
        {
            GreetPeople("Jimmy Zhang", EnglishGreeting);
            GreetPeople("张子阳", ChineseGreeting);
        }
    }
}