一、委托的概念

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

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

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

二、委托的声明

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

三、委托的使用

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

    四、委托的意义

      1、没有委托就没有异步

      2、解耦

      3、高效扩展

     public class CallStudent
    {
    //方法1
    public static void CallStudentA(string name)
    {
    Console.WriteLine("{0}", name);
    }
    //方法2
    public static void CallStudentB(string name)
    {
    Console.WriteLine("{0}", name);
    }
    //方法3
    public static void CallStudentC(string name)
    {
    Console.WriteLine("{0}", name);
    } //传值的方式,根据值来决定行为,所有的方法全部耦合在一起,
    //如果要增加方法则需要修改该方法,不便于方法的封装、扩展
    public static void CallStudentName(string name, StudentType type)
    {
    if (type == StudentType.A)
    {
    Console.WriteLine("{0}", name);
    }
    else if (type == StudentType.B)
    {
    Console.WriteLine("{0}", name);
    }
    else if (type == StudentType.C)
    {
    Console.WriteLine("{0}", name);
    }
    } //用委托的方式来实现传递方法,如果要增加方法,只需要重新增加一个方法就好
    public static void CallStudentName(string name, CallStudentHandler handler)
    {
    handler.Invoke(name);
    }
    } public delegate void CallStudentHandler(string name); public enum StudentType
    {
    A,
    B,
    C
    }
     static void Main(string[] args)
    {
    //用不同的值来区分不同的方法
    CallStudent.CallStudentName("Student A",StudentType.A );
    CallStudent.CallStudentName("Student B", StudentType.B);
    CallStudent.CallStudentName("Student C", StudentType.C );
    Console.WriteLine(); //用委托的方式传递多个方法
    CallStudentHandler handlerA = new CallStudentHandler(CallStudent.CallStudentA);
    CallStudent.CallStudentName("Student A", handlerA); CallStudentHandler handlerB = new CallStudentHandler(CallStudent.CallStudentB);
    CallStudent.CallStudentName("Student B", handlerB); CallStudentHandler handlerC = new CallStudentHandler(CallStudent.CallStudentC);
    CallStudent.CallStudentName("Student C", handlerC);
    Console.WriteLine(); //用匿名函数的方法替代上述写法
    CallStudentHandler handler1 = new CallStudentHandler(
    delegate(string name)
    {
    Console.WriteLine("{0}", name);
    }); //用匿名的方式把方法名给去掉
    handler1.Invoke("Student A"); //用lambda表达式的方式1 替代上述写法
    //Lambda表达式的本质就是一个匿名方法
    CallStudentHandler handler2= new CallStudentHandler(
    (string name)=>
    {
    Console.WriteLine("{0}", name);
    }); //用lambda表达式的方式把delegate换成=> 箭头左边是参数列表,右边是方法体
    handler2.Invoke("Student A"); //用lambda表达式的方式2
    CallStudentHandler handler3 = new CallStudentHandler(
    (name) =>
    {
    Console.WriteLine("{0}", name);
    }); //去掉参数类型
    handler3.Invoke("Student A"); //用lambda表达式的方式3
    CallStudentHandler handler4 =(name) =>
    {
    Console.WriteLine("{0}", name);
    }; //去掉 new CallStudentHandler
    handler4.Invoke("Student A"); //用lambda表达式的方式4
    CallStudentHandler handler5 = (name) => Console.WriteLine("{0}", name); //去掉{},适用于方法体只有一行
    //去掉{}后,如果方法体只有一行,带返回值的去掉return
    handler5.Invoke("Student A"); Console.ReadLine();
    }

    参考:https://www.cnblogs.com/goldendragon/p/9922592.html

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

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

    2018年11月7日     小雨 一.委托的概念 委托和类一样是一种用户自定义类型,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行. 借用百度上的 ...

  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. Android Webview H5资源本地化

    Android Webview H5资源本地化 一. 创建读取资源项目独立模块 1. 项目依赖的好处 符合模块化的思想,他们相互独立.一个项目持有另一个项目的引用,修改更加方便. (注:compile ...

  2. 使用A线程打印1-52,B线程打印A-Z,要求按照12A34B56C....5152Z的顺序进行交替打印

    多线程同步问题,都需要用到监视器,用来监视资源是否可用.C++中使用condition_variable,Java中使用Condition来实现同步. 1. 实现思路 需要有一个全局变量控制当前该哪个 ...

  3. go程序基于阿里云CodePipeline的一次devops实践

    背景 最近朋友有个项目代码托管用的码云,测试服务器(阿里云ECS)只有一台,三四个人开发,于是想基于阿里云的CodePipeline快速打造一套自动化cicd的流程,使用docker来进行多套环境部署 ...

  4. App工程结构

    在经过千辛万苦各种填坑终于安装好了Android Studio之后,在其自带的模拟器上成功运行了第一个APP(hello world),通过这个APP首先研究了一下APP基本的工程结构,从而使后面的开 ...

  5. RxHttp 让你眼前一亮的Http请求框架

    1.前言 RxHttp在今年4月份一经推出,就受到了广大Android 开发者的喜爱,截止本文发表在github上已有1100+star,为此,我自己也建个RxHttp&RxLife 的群(群 ...

  6. Python和Anoconda和Pycharm联合使用教程

    简介 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. ...

  7. Vue之计算属性Computed和属性监听Watch,Computed和Watch的区别

    一. 计算属性(computed) 1.计算属性是为了模板中的表达式简洁,易维护,符合用于简单运算的设计初衷. 例如: <div id="app"> {{ myname ...

  8. day17 二分查找

    # 什么叫算法 # 计算的方法 # 99 * 13 = 1287 = 13 * 100 - 13 # 查找 : 找数据 # 排序 : # 最短路径 # 我们学习的算法,都是过去时 # 了解基础的算法, ...

  9. node中 package.json 文件说明

    1.概述 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文 ...

  10. 等差数列,for循环,递归和尾递归的对比

    生活中,如果1+2+3+4.....+100,大家基本上都会用等差数列计算,如果有人从1开始加,不是傻就是白X,那么程序中呢,是不是也是这样.今天无意中看到了尾递归,以前也写过,但是不知道这个专业名词 ...