第二十六讲:深入委托

来源:互联网 发布:java gc日志分析工具 编辑:程序博客网 时间:2024/05/06 06:18
主要内容
    1. 我们忽略的事件与委托
        有关于窗口加载的系统预定义的原代码的理解
    
    2. 定义,使用委托
        分两步
        1. 定义要使用的委托
        2. 创建实例
        
    3. 实践--说媒,娶媳妇的标准
    
    4. 多播委托
        1. 可以让一个委托去调用一系列的方法
        
        2. 采用+=增加到执行序列,使用-=从序列移除
        
        
    5. 匿名方法
        没有方法签名,只有方法体
        如:
            delegate void del;
            del d=delegate(object o,EventArgs e){};//注意这里是要加分号的
            
            
            
    6. Lambda表达式
        Lambda表达式是一个匿名方法,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。
        例:
            delegate void d(string msg);
            d=msg=>{consol.writeline(msg)};
            
            d("lambda表达式");
        
    7. 实践--窗体互动

        委托,事件的使用


边看边实践,写的代码有点乱:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Con26{    class Program    {        public delegate void helloDelegate(string s); //定义一个委托        public static event helloDelegate test1;//定义一个事件        public delegate int addDelegate(int a, int b); //定义一个带两个参数且有整型返回值的委托        public static event addDelegate addMethod;        static void Main(string[] args)        {                        //***************委托:我的理解是它是就相当于一个数据类型,可以定义方法*******            helloDelegate he = returnMessage;//这里就定义并初始化委托,它的值就是一个方法名            //**************************************            he += returnMessage2;//虽说跟整型等数据类型同样可以使用+=运算符,但执行结果却是批处理的方式            //************使用delegate关键字还可以定义匿名方法,只是精简了代码,性能上无提升****            he += delegate(string s) {                Console.WriteLine("这是一个匿名的方法" + s);            };            //***************事件处理方式也可以是一个匿名方法**********            test1 += delegate(string s)            {                Console.WriteLine("这又又又又。。。。。又是一个匿名的方法"+s);            };            //************这是个Lamada表达式,这次要好好的理解它*************            helloDelegate h1 = ss => Console.WriteLine(ss);            h1("Lamada表达式的使用");            he("大家好啊!");            //************这是个还两个参数的Lamada表达式,而且还有返回值*************            addDelegate add = (a, b) => a * b;            int i = add(23, 34);            //************有返回值的委托与事件*************            addMethod +=new addDelegate(addM);                        Console.WriteLine(i);            Console.WriteLine(test(12, 23));//被委托执行的方法得到返回值            Console.ReadKey();        }        /// <summary>        /// 还一个参数,返回并打印字符串        /// </summary>        /// <param name="s">字符串参数</param>        public static void returnMessage(string s)        {            Console.WriteLine("返回一个字符串串"+s);            test1(s);//事件就是一个触发性的监视        }        /// <summary>        /// 还一个参数,返回并打印字符串        /// </summary>        /// <param name="s">字符串参数</param>        public static void returnMessage2(string s)        {            Console.WriteLine("返回第二个字符串串" + s);        }        /// <summary>        /// 多个参数的方法        /// </summary>        /// <param name="a">参数1</param>        /// <param name="b">参数2</param>        /// <returns>返回整型</returns>        public static int test(int a,int b)        {            Console.WriteLine("我是被监视的对象");            return addMethod(a, b);        }        /// <summary>        /// 多个参数的方法        /// </summary>        /// <param name="a">参数1</param>        /// <param name="b">参数2</param>        /// <returns>返回整型</returns>        public static int addM(int a, int b)        {            return a + b;        }    }}

执行结果:

像Lamada表达式,委托,匿名方法,扩展方法这些,田老师认为不必过深研究的东东,高手们用着跟玩笑似的,看来确实是高手,如果我们听老师的不求甚解,高手写的代码还直没办法看的懂。多多少少还是要深入一下,只要努力多码代码,理解是早晚的事儿!

0 0