2018年11月7日     小雨

一、委托的概念

  1. 委托和类一样是一种用户自定义类型,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。

  2. 借用百度上的一句话概括:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,

    可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性

二、委托的声明

  与对应的方法具有相同的参数类型、参数个数、返回值。通俗来讲就是“函数的模板原型”。

三、委托的使用

  1. 用delegate声明一个委托
  2. 委托实例化
  3. 调用
  1. public class DelegateClass
  2. {
  3. public delegate void DelegateTest(int a, int b); //1、声明一个委托
  4.  
  5. public static void Test()
  6. {
  7. DelegateTest method = new DelegateTest(Plus); //2、实例化委托
  8. //DelegateTest method1 = Plus; //实例化委托的另一种等价写法
  9. method.Invoke(, ); //3、调用
  10. //method1(3, 4); //调用的另一种等价写法
  11. }
  12.  
  13. private static void Plus(int a, int b)
  14. {
  15. Console.WriteLine("a={0} b={1}", a, b);
  16. }
  17. }

四、委托的意义

  1、没有委托就没有异步

  2、解耦

  3、高效扩展

  1. public class CallStudent
  2. {
  3. //方法1
  4. public static void CallStudentA(string name)
  5. {
  6. Console.WriteLine("{0}", name);
  7. }
  8. //方法2
  9. public static void CallStudentB(string name)
  10. {
  11. Console.WriteLine("{0}", name);
  12. }
  13. //方法3
  14. public static void CallStudentC(string name)
  15. {
  16. Console.WriteLine("{0}", name);
  17. }
  18.  
  19. //传值的方式,根据值来决定行为,所有的方法全部耦合在一起,
  20. //如果要增加方法则需要修改该方法,不便于方法的封装、扩展
  21. public static void CallStudentName(string name, StudentType type)
  22. {
  23. if (type == StudentType.A)
  24. {
  25. Console.WriteLine("{0}", name);
  26. }
  27. else if (type == StudentType.B)
  28. {
  29. Console.WriteLine("{0}", name);
  30. }
  31. else if (type == StudentType.C)
  32. {
  33. Console.WriteLine("{0}", name);
  34. }
  35. }
  36.  
  37. //用委托的方式来实现传递方法,如果要增加方法,只需要重新增加一个方法就好
  38. public static void CallStudentName(string name, CallStudentHandler handler)
  39. {
  40. handler.Invoke(name);
  41. }
  42. }
  43.  
  44. public delegate void CallStudentHandler(string name);
  45.  
  46. public enum StudentType
  47. {
  48. A,
  49. B,
  50. C
  51. }
  1. static void Main(string[] args)
  2. {
  3. //用不同的值来区分不同的方法
  4. CallStudent.CallStudentName("Student A",StudentType.A );
  5. CallStudent.CallStudentName("Student B", StudentType.B);
  6. CallStudent.CallStudentName("Student C", StudentType.C );
  7. Console.WriteLine();
  8.  
  9. //用委托的方式传递多个方法
  10. CallStudentHandler handlerA = new CallStudentHandler(CallStudent.CallStudentA);
  11. CallStudent.CallStudentName("Student A", handlerA);
  12.  
  13. CallStudentHandler handlerB = new CallStudentHandler(CallStudent.CallStudentB);
  14. CallStudent.CallStudentName("Student B", handlerB);
  15.  
  16. CallStudentHandler handlerC = new CallStudentHandler(CallStudent.CallStudentC);
  17. CallStudent.CallStudentName("Student C", handlerC);
  18. Console.WriteLine();
  19.  
  20. //用匿名函数的方法替代上述写法
  21. CallStudentHandler handler1 = new CallStudentHandler(
  22. delegate(string name)
  23. {
  24. Console.WriteLine("{0}", name);
  25. }); //用匿名的方式把方法名给去掉
  26. handler1.Invoke("Student A");
  27.  
  28. //用lambda表达式的方式1 替代上述写法
  29. //Lambda表达式的本质就是一个匿名方法
  30. CallStudentHandler handler2= new CallStudentHandler(
  31. (string name)=>
  32. {
  33. Console.WriteLine("{0}", name);
  34. }); //用lambda表达式的方式把delegate换成=> 箭头左边是参数列表,右边是方法体
  35. handler2.Invoke("Student A");
  36.  
  37. //用lambda表达式的方式2
  38. CallStudentHandler handler3 = new CallStudentHandler(
  39. (name) =>
  40. {
  41. Console.WriteLine("{0}", name);
  42. }); //去掉参数类型
  43. handler3.Invoke("Student A");
  44.  
  45. //用lambda表达式的方式3
  46. CallStudentHandler handler4 =(name) =>
  47. {
  48. Console.WriteLine("{0}", name);
  49. }; //去掉 new CallStudentHandler
  50. handler4.Invoke("Student A");
  51.  
  52. //用lambda表达式的方式4
  53. CallStudentHandler handler5 = (name) => Console.WriteLine("{0}", name); //去掉{},适用于方法体只有一行
  54. //去掉{}后,如果方法体只有一行,带返回值的去掉return
  55. handler5.Invoke("Student A");
  56.  
  57. Console.ReadLine();
  58. }

浅谈C#委托的用法-delegate的更多相关文章

  1. 浅谈C#委托的用法-delegate[转]

    一.委托的概念 委托和类一样是一种用户自定义类型,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行. 借用百度上的一句话概括:委托是一个类,它定义了方 ...

  2. 浅谈C#委托和事件

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...

  3. 浅谈C#委托和事件【转】

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...

  4. 浅谈C#委托和事件(转载)

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...

  5. 浅谈 C#委托

    看了<CLR via C#>的17章委托后,为自己做一点浅显的总结,也分享给需要的人. .NET通过委托来提供一种回调函数机制,.NET委托提供了很多功能,例如确保回调方法是类型安全的(C ...

  6. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

  7. 浅谈final关键字的用法

    1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...

  8. 浅谈async函数await用法

    今天状态不太好,睡久了懵一天. 以前只是了解过async函数,并还没有很熟练的运用过,所以先开个坑吧,以后再结合实际来更新下,可能说的有些问题希望大家指出. async和await相信大家应该不陌生, ...

  9. 浅谈java中bigInteger用法

    1.赋值: BigInteger a=new BigInteger("1"); BigInteger b=BigInteger.valueOf(1); 2.运算: ① add(); ...

随机推荐

  1. LeetCode 57. Insert Interval 插入区间 (C++/Java)

    题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nec ...

  2. C#XML文件操作随笔

    以为公司一直没有电源屏厂家协议解析为DevVars相关的软件,手写费时费力还容易出错,用了2天时间做了一个.txt协议文件筛选加并解析成xml文件的工具,总结一下用到的几个知识点 1.LINQ 是一个 ...

  3. 软考复习之UML设计篇

    UML统一建模语言 构件图:描述系统的物理结构,它可以用来显示程序代码如何分解成模块 部署图:描述系统中硬件和软件的物理结构,它描述构成系统架构的软件构件,处理器和设备 用例图:描述系统与外部系统及用 ...

  4. IIS在已有站点上->添加应用程序命令

    已有站点:HTTP80 %systemroot%\system32\inetsrv\APPCMD ADD APP /SITE.NAME:"HTTP80" /path:/Redire ...

  5. 循环删除List集合的元素

    之前在使用list集合循环删除元素的时候,竟然出现了集合内的元素不能删除成功的问题,之后整理了一下,发现大有玄机! 1.如果指定了list的size大小,会出现下标越界异常 List<Strin ...

  6. Linux学习记录(二):常用工具

    博主使用的操作系统为Ubuntu tmux 终端分屏 安装 Ubuntu使用apt-get安装 sudo apt-get install tmux 使用 默认命令键:Ctrl + B %(百分号) 左 ...

  7. 纪中9日T4 2298. 异或

    2298. 异或 (File IO): input:gcdxor.in output:gcdxor.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 Sarv ...

  8. CSS相对定位与绝对定位

    1.相对定位 Position : relative ; 特点: 1 如果没有定位偏移量,对元素本身没有任何影响: 2 不使元素脱离文档流,空间是会被保留: 3 不影响其他元素布局: 4 left.t ...

  9. spring cloud config---Could not resolve placeholder 'xxx' in string value "${xxx}"

    初学SpringCloud 跟着视频写配置 前前后后检查了许久,配置代码没问题 最后发现是client项目的配置文件名有问题,不应该是application.yml 而是bootstrap.yml 那 ...

  10. 什么是json? 什么是xml?JSON与XML的区别比较

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.它是基于 JavaScript Prog ...