黑马程序员--委托deleegate和事件event

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值(通俗的讲:委托就是一个方法的容器)所有定义的委托类都继承于MulticastDelegate类又继承与Delegate类

1)简单-代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        #region 委托的简单概述:
        private void btnDelegate_Click(object sender, EventArgs e)
        {
            //委托实例格式:委托名 实例名=new 委托名(参数)   【这里的参数就是方法名,只是没有带括号】
            SayHi sayHiObj = new SayHi(SayHiCN);  //创建一个委托对象sayHiObj(通俗的说委托就是一个装方法的容器)
            sayHiObj += SayHiUS;                  //用运算符"+="向委托对象添加方法,也可以用"-="运算符移除方法
            sayHiObj += StaticMethod;             //也可以添加静态方法
            sayHiObj();                           //如同调用方法一样调用委托
        }
        //创建两个方法,并且方法的签名都和委托一样(返回值类型,有无参数或参数类型顺序一样)
        void SayHiCN()   //中国人说汉语的方法1
        {
            MessageBox.Show("你好!,我是中国人,说汉语的!");
        }
        void SayHiUS()  //美国人说英语的方法2
        {
            MessageBox.Show("Hello,I'm American,Speak English!");
        }
        static void StaticMethod()
        {
            MessageBox.Show("我是静态方法!");
        }
        #endregion
    }
    /*委托是一种引用类型,它存储了方法的引用
      委托类的定义格式:[修饰符] delegate 返回值类型/void 委托名([参数类型 参数]);     */
    delegate void SayHi();  //定义一个委托类

2)委托作为参数

代码:

    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();  //实例一个Test类的test对象
            string s = "调用委托";   //定义一个字符串
            DeShow ds = new DeShow(test.Show); //实例一个委托ds对象
            ds += Show1;                       //使用运算符"+="添加Show1方法到委托对象中
            ds(s);                             //调用委托
            MethodShow(test.Show);            //调用包含委托为参数的方法,并且把test.Show方法传入
            Console.ReadKey();
            /*结果:
             调用委托
             字符串的长度:4
             显示一个普通方法!
             ----------------------------------
             字符串的长度:34
             -----------委托作为参数-----------
             字符串的长度:28
             ----------------------------------
             字符串的长度:34
                                             */
        }
        /// <summary>
        /// 定义一个包含委托为参数的方法
        /// </summary>
        static void MethodShow(DeShow deShow)    //传入字符串的方法,且委托作为参数
        {
            deShow("----------------------------------");
            deShow("-----------委托作为参数-----------");
            deShow("----------------------------------");
        }
        static void Show1(string str1)
        {
            Console.WriteLine("显示一个普通方法!");
        }
    }
    public class Test
    {
        public void Show(string Msg)   //显示方法
        {
            Console.WriteLine(Msg);
            Console.WriteLine("字符串的长度:{0}",Msg.Length);
        }
    }
    public delegate void DeShow(string str); //定义一个委托类

3)泛型委托为参数的方法

代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //创建人的数组
            person[] persones =
            {
                new person(){Name="刘诗诗",Age=25},
                new person(){Name="范冰冰",Age=32},
                new person(){Name="景甜",Age=23},
                new person(){Name="全智贤",Age=31}
            };
            //调用委托时,传入一个数组和一个方法,获取一个最大和最小元素的返回值
            person getMax = GetMax<person>(persones, GetPer);
            person getMin = GetMin<person>(persones, GetPer);
            MessageBox.Show(getMax.Name+"-"+getMax.Age.ToString()+"岁"+"|"+getMin.Name+"-"+getMin.Age+"岁");  //输出元素的名字和年龄
        }
        #region 定义一个比较方法
        int GetPer(person x, person y)
        {
            if (x.Age > y.Age)
            {
                return 1;
            }
            else if (x.Age < y.Age)
            {
                return -1;
            }
            return 0;
        }
        #endregion
        #region 定义一个泛型类型且委托为参数的方法
        /// <summary>
        /// 获得数组里最大和最小的元素
        /// </summary>
        /// <typeparam name="T">泛型参数</typeparam>
        /// <param name="arrT">泛型数组</param>
        /// <param name="decom">用来比较两个元素的方法</param>
        /// <returns></returns>
        T GetMax<T>(T[] arrT1, DeCompare<T> decomMax)  //获取最大元素的泛型方法
        {
            T Max = arrT1[0];
            for (int i = 1; i < arrT1.Length; i++)
            {
                //如果委托返回1,说明arrT[i]>Max
                if (decomMax(arrT1[i], Max) == 1)
                {
                    Max = arrT1[i];
                }
            }
            return Max;
        }
        T GetMin<T>(T[] arrT2, DeCompare<T> decomMin) //获取最小元素的泛型方法
        {
            T Min = arrT2[0];
            for (int i = 1; i < arrT2.Length; i++)
            {
                //如果委托返回-1,说明arrT[i]< Min
                if (decomMin(arrT2[i], Min) == -1)
                {
                    Min = arrT2[i];
                }
            }
            return Min;
        }
        #endregion
    }
    #region 定义人的类,包含名字和年龄字段
    public class person
    {
        public string Name;
        public int Age;
    }
    #endregion
    /// <summary>
    /// 泛型委托 -- 返回值为int类型,如果 t1>t2,则返回1 ,t1=t2 返回0 , t1<t2 返回-1
    /// </summary>
    public delegate int DeCompare<T>(T t1,T t2);

 

 事件通俗说就是对委托的约束  声明格式:修饰符 event 事件类型 事件名;    (其中事件类型是委托类型)

代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            person per = new person();
            per.deEvent += SayHiCN; //为事件添加方法
            per.deEvent += SayHiUS;
            per.TestEvent();
        }
        public void SayHiCN()   //中国人说汉语的方法1
        {
            MessageBox.Show("你好!,我是中国人,说汉语的!");
        }
        public void SayHiUS()  //美国人说英语的方法2
        {
            MessageBox.Show("Hello,I'm American,Speak English!");
        }
        static void StaticMethod()
        {
            MessageBox.Show("我是静态方法!");
        }
    }
    public class person
    {
        public event DeEventPer deEvent; //定义事件
        //创建事件就相当于 创建了:
        //1.一个私有的委托对象
        //2.一组事件属性方法:add 和 remove 方法,并且这两个方法都直接操作 第一步创建的委托对象
        public void TestEvent()
        {
            deEvent();  //调用事件   
        }
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
    public delegate void DeEventPer(); //定义一个委托类型

 

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值