委托的学习总结

1、委托是什么?
委托就是能将方法当作参数传递的东西。举个栗子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDelegate
{
    public delegate void DelSayHi(string UserName);//这里就定义了一个委托类型,实际编译的时候它是一个类,只不过publc class改成了public delegate,并且多了个返回值(这里是void)夹在中间,然后类名(DelSayHi),最后就是定义委托的参数签名:它有多少个输入参数,各是什么类型。
    class Program
    {
                static void Main(string[] args)
        {

            //这里实例化了一个委托对象,另外还有一种写法DelSayHi hi=new DelSayHi(SayHiChinese);编辑出来的结果一样一样的。
            DelSayHi hi = SayHiChinese;

            //将这个委托当然参数,传给了Runner函数,就跟一个实例化一个类后,将其传给一个函数;
            Runner("三及弟", hi);



            //这里就进一步简化了,不需要用一个类实例去接装着,再调用,就直接将函数名做参数传过去便可以,换个想法,其实函数
            //SayHiChinese和SayHiEnglish它的返回值,参数个数、参数类型(这三者合起来就叫函数签名)跟定义的委托类型DelSayHi一至
            //那么就可以理解SayHiChinese和SayHiEnglish 本身就是委托类型DelSayHi的实例。
            Runner("柯南", SayHiChinese);
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="name"></param>
        /// <param name="delSayhi">我就是一个委托类型的参数:将要执行的函数本身传递了过来</param>
        public static void Runner(string name, DelSayHi delSayhi)
        {
            delSayhi(name);
        }


        public static void SayHiEnglish(string UserName)
        {
            Console.WriteLine("what's up!"+UserName);
        }
        public static void SayHiChinese(string UserName)
        {
            Console.WriteLine("吃了吗!" + UserName);
        }
    }
}

上面代码,只要理解两个想法,就能明白委托本身是什么:
1、为了将函数作为参数,就有了委托
2、委托的实质,也就是一个类。

————————–来一条恶心的分隔线———————–

知道委托是什么后,第一反应应该是这样:然并卵。
1、直接调那个函数不就好了吗?
2、不直接调,有很明显的解耦作用吗?
没解决这两问题,实际开发中还真用不上委托。上面的demo只不过是解释了委托是什么鬼。深入点就慢慢发现有意思的事情了。带着耐心再了解委托的其它知识先:
1、多播委托(完全题外话,先不管了)
2、匿名函数
3、泛型委托
4、lambda表达式

关于《2、匿名函数》
匿名函数,就像是语法糖,上边的代码中,为了使用委托,不得不定义一个以上方法
public static void SayHiEnglish(string UserName)
public static void SayHiChinese(string UserName)
….
利用匿名函数就可以轻松省事了,上代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AnonymousFunction
{
    public delegate string MyDelegate(string input);//定义一个委托,输入参数就一个string,返回也是一个string

    class Program
    {


        /// <summary>
        /// 这个栗子目的是为了对字符串进行处理
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            string input = "2#sdf23fa2FASD2";
            //我要转大写
            string outPut = Runner(input, delegate (string parm) { return parm.ToUpper(); });//直接用delegate关键字,后边的写法就跟函数一样了
            Console.WriteLine(outPut);

            //我要去掉2,因为我不二,更不二百五
            outPut = Runner(input, delegate (string parm) { return parm.Replace("2", ""); });//直接用delegate关键字,后边的写法就跟函数一样了
            Console.WriteLine(outPut);

            Console.ReadLine();
        }

        static string Runner(string input, MyDelegate mydelgate)
        {
            input = input.Trim();
            return mydelgate(input);
        }
    }
}
这段代码应该不用多解释,只不过利用上了delegate关键字,将方法写在调用的参数里头去了。这样省事,省代码,省电,省时间。损失是方法体这样写,就不能像平时的函数一样被其它地方重复调用。

感觉有了delegate关键字,省去再写了个函数的工夫,不足以让人感动,还是不想去用它。还是耐心去看下

关于4、lambda表达式
针对上边的匿名函数,再一改造就成了lambda表达式了,再上代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyLambda
{
    public delegate string MyDelegate(string input);//这句别看了,跟上边的函数名字一样,我复制过来的
    class Program
    {
        static void Main(string[] args)
        {
            string input = "2#sdf23fa2FASD2";


            //我要转大写
            string outPut = Runner(input, (string parm) =>{ return parm.ToUpper(); });//整段代码,只不过就去掉delegate关键字,再在方法体与输入参数括号后加上=>这个符号,微信为这个符号起个名字叫goes to
            Console.WriteLine(outPut);

            //我要去掉2,因为我不二,更不二百五
            outPut = Runner(input, (string parm)=> { return parm.Replace("2", ""); });
            Console.WriteLine(outPut);

            Console.ReadLine();

        }

        /// <summary>
        /// 不用看这里了,也是复制过来的
        /// </summary>
        /// <param name="input"></param>
        /// <param name="mydelgate"></param>
        /// <returns></returns>
        static string Runner(string input, MyDelegate mydelgate)
        {
            input = input.Trim();
            return mydelgate(input);
        }

    }
}

整段代码,只不过就去掉delegate关键字,再在方法体与输入参数括号后加上=>这个符号,微信为这个符号起个名字叫goes to。于是,一真纠结于心的lambda表达式为什么有这样奇怪而不奇葩的写法就快解开了。还剩下Expression

//未完待续。。老板催工作。

本人第一次写blog,纯属学习总结果,不对之前请指出。
转载请指明出处,谢谢!

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值