一、基本概念

有过买二手房交易的朋友都有感触,办理过户等等一系列手续都是相当麻烦的,这个时候,房产中介出现了,我们只需要将必备资料交个中介,他们就会帮忙办理的妥妥的,我们并不需要关系整个办理过程,这个过程就是委托,委托房产中介办理相关手续。再入,我们用的苹果手机,也并不是苹果公司直接生产,也是委托代工厂进行生产,下面就通过苹果手机的代理生产过程解析委托。

二、苹果手机代工过程

2.1 苹果公司定义好本次手机的生产规格(定义委托)传入生产规格,返回手机

public class Phone{/// <summary>/// 定义委托,传入生产规格,返回一个符合规格的手机/// </summary>/// <param name="space"></param>/// <returns></returns>public delegate string CreateIPhone11(string space);//等待代工厂加入public CreateIPhone11 createIPhone11 = null;/// <summary>/// 发布开始生产指定/// </summary>public void IPhone11Create(){if(createIPhone11!=null){//通知代理厂进行生产Console.WriteLine($"新款IPhone【{createIPhone11.Invoke("6.1寸")}】");}}}

2.2 代工厂制定一套方案,可以满足苹果公司的要求

    public class Foxconn{public string FoxconnIphon11(string space){//一系列逻辑return "富士康生产的Iphone11";}}

2.3 建立联系(为委托绑定方法),苹果公司发布生产指令

    class Program{static void Main(string[] args){//苹果公司成立var CompanyPhone = new Phone();//富士康工厂建立var CompanyFoxconn = new Foxconn();//苹果公司 和富士康达成合作协议CompanyPhone.createIPhone11 = CompanyFoxconn.FoxconnIphon11;//苹果公司要求生产CompanyPhone.IPhone11Create();Console.ReadLine();}}

2.4 执行结果

2.5 总结:上面的例子主要想要表述委托在实际生活中的运用,整个委托运用过程如下

1.定义委托(特殊类)

public delegate string CreateIPhone11Delegate(string space);

2.实例化委托

public CreateIPhone11Delegate CreateIPhone11 = null;

3.为委托绑定方法

3.1 CreateIPhone11 = fun1;

3.2 CreateIPhone11+=fun2;  委托可以绑定一系列符合要求的方法(相当于IPHONE11可以有不同的代工厂同时生产),在INVOKE时候依次执行

4.取消委托绑定的方法

CreateIPhone11 -= fun1; 取消不合格的代工厂

5.有些地方可以简化2,3步骤,初始化直接绑定

public CreateIPhone11Delegate CreateIPhone11 = fun1;

三、进阶

如上,每次使用委托的时候都要定义一个委托类型,指定要绑定方法的输入输出类型,.netframework2.0 以后出现了泛型,框架就提预定义的委托类型,方便我们直接使用

3.1 Action

看源码

    //// 摘要://     封装一个方法,该方法不具有参数且不返回值。[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]public delegate void Action();

其实就是一个委托类型,和我们定义的时候一模一样,无参输入,无参输出。

也可以通过泛型,指定多个(最多16个输入参数),但都无返回值

3.2 Func

看源码:

using System.Runtime.CompilerServices;namespace System
{//// 摘要://     封装一个方法,该方法不具有参数,且返回由 TResult 参数指定的类型的值。//// 类型参数://   TResult://     此委托封装的方法的返回值类型。//// 返回结果://     此委托封装的方法的返回值。[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]public delegate TResult Func<out TResult>();
}

也是系统定义的委托类型,只不过有一个强行的输出类型

同样,也有泛型的委托,支持16个参数的输入

所以可以简化我们上面的代码无需自己定义单独的委托,使用系统预定义的委托,完整如下:

namespace PhoneCreate
{class Program{static void Main(string[] args){//苹果公司成立var CompanyPhone = new Phone();//富士康工厂建立var CompanyFoxconn = new Foxconn();//苹果公司要求生产   并将富士康生产方法传入CompanyPhone.IPhone11Create(CompanyFoxconn.FoxconnIphon11);Console.ReadLine();}}    public class Phone{/// <summary>/// 发布开始生产指定/// </summary>public void IPhone11Create(Func<string,string> createIPhone11){if(createIPhone11!=null){Console.WriteLine($"新款IPhone【{createIPhone11.Invoke("6.1寸")}】");}}}public class Foxconn{/// <summary>/// 实现IPhone11生产/// </summary>/// <param name="space"></param>/// <returns></returns>public string FoxconnIphon11(string space){//一系列逻辑return $"富士康生产的Iphone11{space}";}}

四、实际运用

冥冥之中,我们其实已经在使用委托,只是,我们可能不知道而已,下面例子,假设两个员工工资和年薪都不一样,我们要找出所有员工中最高薪资,最高年终奖,最高年收入是多少,需要用List 中Max方法。

4.1 创建员工对象

public class Emp{//姓名public string EmpName { get; set; }//月薪public int Salary { get; set; }//年终奖public int Bonus { get; set; }public override string ToString(){return $"{EmpName}:年薪:{Salary},年终奖:{Bonus}";}}

4.2 创建列表

            List<Emp> emps = new List<Emp>();emps.Add(new Emp{EmpName = "Nemo",Salary = 100000,Bonus = 20000});emps.Add(new Emp{EmpName = "Claire",Salary = 120000  ,Bonus = 1000});

4.3 分别找出符合条件员工

            //年薪最高值var maxSalary = emps.Max(con => con.Salary);//年终奖最高值var maxBonus = emps.Max(con => con.Bonus);//年收入最高值var maxInput = emps.Max(con => con.Salary + con.Bonus);Console.WriteLine($"年薪最高值:{maxSalary.ToString() }");Console.WriteLine($"年终奖最高值:{maxBonus.ToString() }");Console.WriteLine($"年收入最高值:{maxInput.ToString() }");Console.ReadLine();

4.4 输出结果

4.5 max 方法解析,先看源码

Func<TSource,int>就是一个委托,相当于,IEnumberable 通过枚举的方式将List的中每个Emp对象给你,然后你制定一个求最大的值得规则,Max然后按照你给的规则进行给你寻找。

当然上面 con=>con.ss  是匿名方法,顺便说一下,就是有时候我们的方法只需要调用一次,就无需单独写一个方法出来,在使用Linq的时候,非常常见。

五、总结

委托,一句话概括,就是可以将方法当做方法的参数进行传递。

C#深入学习--委托相关推荐

  1. unity学习-委托(delegate),事件(event),Action,Func

    unity学习 委托 含义 定义 使用 事件 含义 使用 在进行项目的过程中,一直存在着对代码管理不当的问题,所以需要学习一些科学的代码思维,减少后期功能的修改与迭代引发的代码冗杂和内存爆炸 可以看b ...

  2. (周星驰版)学习委托的最好实例 (转载+自己补充了注释)

    ".net百题问答的活动"--许多人问过的--< C#委托及事件 > 有许多人问的,.Net中的委托以及事件处理.我拿简单的例子说明一下,是现实中的例子: 比如说一个公 ...

  3. .Net学习——委托

    1 什么是委托 委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.调用委托变量时,就是执行该变量指 ...

  4. C#学习(一):委托和事件

    预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...

  5. C#编程利器之四:委托与事件(Delegate and event) (上)

    本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...

  6. C#:委托基础与事件

    通过以下思维导图,学习委托的基本概念,后面着重讲解委托的运用,希望通过最简单的方式收获更多的知识. 1.委托的各种写法 1.委托 委托名=new 委托(会调用的方法名); 委托名(参数); 2.委托 ...

  7. C#编程之委托与事件(一)

    多线程程序设计是一个庞大的主题,而本文试图在.net Framework环境下,使用C#语言来描述委托.事件.多线程程序及反射的概貌.希望本文能有助于大家理解委托.事件.多线程及反射的概念,理解委托. ...

  8. 笑谈“委托”与“事件”

    这几天学习委托的时候,突然冒出了一个很有趣的想法,写出来与大家分享: 有一天,我饿了,虽然我拥有白菜和猪肉,本来能够做一道美味的白菜炖猪肉,但我却没有把白菜和猪肉做成白菜炖猪肉的方法.这时,我想到了& ...

  9. 测试Unity中常用代码的运行所需时间:循环和函数篇 #性能测试 # for,foreach,while循环 #委托事件

    C# 循环和函数篇 〇.前言 系统自带计时器 -System.Diagnostics.StopWatch- 的使用 一.循环类型测试 1. for 循环测试 (1). 前后置自增自减测试 (2). 与 ...

最新文章

  1. Activiti——准备开发环境(一)
  2. 利用 CSS selector 改变悬停表格样式
  3. 天天用 Spring,bean 实例化原理你懂吗?
  4. 远程java接口说明
  5. Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数)
  6. pythonguitkinter组件_四十八、Python中的GUI布局tkinter
  7. 免校准的电量计量芯片_单相电能表如何校准(单相电能计量芯片+MCU)
  8. Android LowMemoryKiller ADJ原理
  9. 3dmax局部渲染变黑原因及解决方法
  10. 拼多多搬家上货助手怎么用?方法步骤有?
  11. ODL之VTN详解-Mac Map
  12. python生成随机中文_随机字生成器-Python
  13. 树莓派hdmi输出没声音_如何解决外接Hdmi没有声音的问题
  14. 吴恩达深度学习笔记(40)-指数加权平均数优化算法
  15. 【Day4.3】大皇宫内蹭讲解
  16. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)boost::scoped_ptr
  17. 2023牛客寒假算法集训营3
  18. 为什么c语言是学不完的,为什么C语言诡异离奇、缺陷重重,却获得了巨大的成功?...
  19. Hadoop实战篇(1)
  20. 学习笔记(5)-标签传播(LPA)小结

热门文章

  1. 单例模式(饿汉单例模式and懒汉单例模式)
  2. 硬件设计之JTAG转USB转换芯片
  3. 骁龙8gen1和苹果A15评测哪个好
  4. 【DB笔试面试606】在Oracle中,coe_xfr_sql_profile.sql脚本的作用是什么?
  5. 物联网设备数据流转之数据何时存储:Spring事件及监听机制, 数据入库
  6. linux图片处理convert命令
  7. 绝对隐私:华为公司员工待遇全面揭秘
  8. 【blade的UI设计】理解前端MVC与分层思想
  9. HP大中华区总裁孙振耀撰文谈退休并畅谈人生【全详细】
  10. 计算机网络(谢希仁-第八版)第五章习题全解