第二十六讲:深入委托

主要内容
    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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值