C#难点语法讲解之委托---从应用需求开始讲解

2023-10-30

一、委托的定义

委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

简单解释:变量好控制,方法不好控制,委托可以把方法变成变量

二、例子解释定义

如果我们有一个数组,里面有10个数据:(数组就是变量的一种)

int[] num = new int[10] {0,1,2,3,4,5,6,7,8,9};

现在,我们想把它们每个都输出一遍,我们可以:

   public void OutPut()
    {
        foreach (int item in num)
        {
            Console.WriteLine(item);
        }
    }

那如果我们有十个方法:

 public void Fun0() 
    {
        Console.WriteLine(0);
    }
    public void Fun1()
    {
        Console.WriteLine(1);
    }
    public void Fun2()
    {
        Console.WriteLine(2);
    }
    public void Fun3()
    {
        Console.WriteLine(3);
    }
    public void Fun4()
    {
        Console.WriteLine(4);
    }
    public void Fun5()
    {
        Console.WriteLine(5);
    }
    public void Fun6()
    {
        Console.WriteLine(6);
    }
    public void Fun7()
    {
        Console.WriteLine(7);
    }
    public void Fun8()
    {
        Console.WriteLine(8);
    }
    public void Fun9()
    {
        Console.WriteLine(9);
    }

现在,我们想把它们每个都用一遍,我们就得:

    public void OutPut()
    {
        Fun0();
        Fun1();
        Fun2();
        Fun3();
        Fun4();
        Fun5();
        Fun6();
        Fun7();
        Fun8();
        Fun9();
    }

如果,这时候,你觉得还好,那需求如果继续变化:

1.周一希望执行方法2、4、6、8

2.周二想执行方法1、3、5、7

3.周三想执行方法0、1、2、3、4

4.周四想执行方法5、6、7、8、9

5.周五我希望在这10个方法里,随机抽取两个方法执行

就问你难不难受,你要写好几组

如果这时候,他和数组一样,就很好写了(这就是变量比方法好用的地方)

三、把方法做成变量

整数是int

字符串是string

方法是 delegate

四、把一个已经有的方法和delegate联系起来

1.联系一个普通方法
 public void Fun0() 
    {
        Console.WriteLine(0);
    }

我们需要让这个委托长得和这个普通的方法一样

public delegate void Apple();

    public void Fun0() 
    {
        Console.WriteLine(0);
    }

这里的格式指的是:括号里有没有参数,有没有返回值

为什么要给委托起名字?

因为你可能建很多委托啊,有参数的,没参数的,需要return的,不需要return的。

例(有参数的):

    //方法
    public void Fun1(string s)
    {
        Console.WriteLine(1);
    }

    //建立委托(抄方法的格式)
    public delegate void Apple1(string s);


    //把委托和方法联系起来
    public void OutPut()
    {
        Apple1 apple1 = Fun1;
    }

例(有两个参数的):

    //方法
    public void Fun2(string s,string s1)
    {
        Console.WriteLine(1);
    }
    
    //建立委托(抄方法的格式)
    public delegate void Apple2(string s, string s1);

    //把委托和方法联系起来
    public void OutPut()
    {
        Apple2 apple2 = Fun2;
    }

例(有返回值的):

不需要参数咱就把参数删了就行,相信大家都是灵活的宝宝~~

    //方法
    public int Fun3(string s,string s1)
    {
        Console.WriteLine(1);
        return 1;     
    }

    //建立委托(抄方法的格式)
    public delegate int Apple3(string s, string s1);

    //把委托和方法联系起来 
    public void OutPut()
    {
        Apple3 apple2 = Fun3;
    }

五、委托应用

回到我们最开始的故事,我们用委托,就可以把方法当变量了

(注意,这些方法格式是一样的,都是无返回值,无参数)

方法,还是那10个方法,委托还是那个委托

public delegate void Apples();
 
public void Fun0()
    {
        Console.WriteLine(0);
    }
    public void Fun1()
    {
        Console.WriteLine(1);    
    }
    public void Fun2()
    {
        Console.WriteLine(2);
    }
    public void Fun3()
    {
        Console.WriteLine(3);
    }
    public void Fun4()
    {
        Console.WriteLine(4);
    }
    public void Fun5()
    {
        Console.WriteLine(5);
    }
    public void Fun6()
    {
        Console.WriteLine(6);
    }
    public void Fun7()
    {
        Console.WriteLine(7);
    }
    public void Fun8()
    {
        Console.WriteLine(8);
    }
    public void Fun9()
    {
        Console.WriteLine(9);
    }

我们可以搞个委托数组,把这些方法都放进去 

    public void OutPut()
    {
    //委托数组,Apples是之前建立的按Fun方法写的委托
        Apples[] apples =new Apples[10];

        apples[0] = Fun0;
        apples[1] = Fun1;
        apples[2] = Fun2;
        apples[3] = Fun3;
        apples[4] = Fun4;
        apples[5] = Fun5;
        apples[6] = Fun6;
        apples[7] = Fun7;
        apples[8] = Fun8;
        apples[9] = Fun9;
    }

开始用啦!!!!!快乐来了

 public void OutPut()
    {
        Apples[] apples =new Apples[10];

        apples[0] = Fun0;
        apples[1] = Fun1;
        apples[2] = Fun2;
        apples[3] = Fun3;
        apples[4] = Fun4;
        apples[5] = Fun5;
        apples[6] = Fun6;
        apples[7] = Fun7;
        apples[8] = Fun8;
        apples[9] = Fun9;


        //执行Fun0-4
        for (int i = 0; i < 5; i++)
        {
            apples[i]();
        }

        //执行Fun5-9
        for (int i = 5; i < 10; i++)
        {
            apples[i]();
        }


        //执行Fun1-3-5-7-9
        for (int i = 1; i < 10; i=i+2)
        {
            apples[i]();
        }
    }

就不往多的写了,意思就是这个意思,我们可以把方法当参数了,与此同时,你也可以搞list,也可以在括号里传递委托,等等等等,,,如果有疑问,请写在评论区,我会继续补充修改的~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#难点语法讲解之委托---从应用需求开始讲解 的相关文章

随机推荐

  • 用科学计数法表示二进制小数_数值数据的表示

    在学习之前 我们先来看一段代码的计算 为什么会出现这样的结果呢 std 在计算机中最主要的数据类型有无符号整型 有符号整型 浮点数 布尔值 布尔值 就是真 假 1或者0 在计算机中用最小的1个字节表示 即8位 无符号整型 即我们数学中的正整
  • android本地xml配置,Android Studio创建的Android项目一般需要忽略

    1 idea文件夹 2 gradle文件夹 3 所有的build文件夹 4 所有的 iml文件 5 local properties文件 第一种 在Android Studio中设置 第二种 在项目的 idea workspace xml的
  • Java多线程文件下载器高文件下载速度

    使用多线程下载器提高文件下载速度 在进行大文件下载时 使用多线程技术可以显著提高下载速度 本文将介绍如何使用多线程下载器来实现并行下载 以加快文件下载过程 多线程下载器简介 多线程下载器是一种利用多线程同时下载文件的工具 它将大文件分割成多
  • SSD(pytorch)自建数据集训练及测试

    一 数据集准备 SSD代码 GitHub amdegroot ssd pytorch A PyTorch Implementation of Single Shot MultiBox Detector 采用的VOC格式的数据集 在data文
  • odoo16安装教程,全球第一开源ERP平台

    虚拟机版本 ubuntu 22 10 本人用的是这个版本的ubuntu系统 也可以使用最新版本的 准备工作 打开虚拟机 ubuntu系统 进入终端 更新系统 sudo apt get update sudo apt get upgrade
  • js 获取两个时间之间相差月份

    话不多说 直接上代码 获取两个时间月份差 function getMonths start end var result var starts start split var ends end split var staYear start
  • Unity UGUI 添加 Material(材质)

    在给 UGUI 添加 Material 时 如果 Material 中的 Shader 不做特殊处理的话 那么此组件将会变成纯黑色 如果需要添加 Material 则需要在 Shader 中做 UGUI 专门的处理 Properties U
  • Android 11以下DialogFragment里弹出PopWindow显示问题

    最近在写UI的时候发现一个非常有意思的事情 Android 11以下在DialogFragment里面弹出PopWindow 最终会被截取 尝试过一些方法以后将解决方案做一个记录 mPopWindow setClippingEnabled
  • 华为手机连电脑当摄像头用_今天才知道,华为手机摄像头还能这样用!还不会用你买什么华为?...

    大家都知道 华为手机的摄像头十分给力 拍照效果很好看 但是你知道吗 华为手机摄像头 不仅仅能拍照 它还有很多隐藏的高级用法 比如今天说的这两个 不到10 的花粉会用 挺可惜的 一 华为手机摄像头高级用法 1 扫描文档 10分钟后就下班了 领
  • Python Tkinter Menu使用教程

    Menu类控件用来实现顶层 下拉 弹出菜单 Patterns Toplevel menus被用来显示在标题栏 root窗口或者其他顶层窗口上 创建一个顶层菜单 创建Menu类的实例 然后使用add方法添加命令或者其他菜单内容 root Tk
  • 30分钟掌握STL系列(二)

    30分钟掌握STL系列 二 迭代器 迭代器提供对一个容器中的对象的访问方法 并且定义了容器中对象的范围 迭代器就如同一个指针 事实上 C 的指针也是一种迭代器 但是 迭代器不仅仅是指针 因此你不能认为他们一定具有地址值 例如 一个数组索引
  • 滴滴前端高频react面试题总结

    当调用 setState的时候 发生了什么操作 当调用 setState时 React做的第一件事是将传递给setState的对象合并到组件的当前状态 这将启动一个称为和解 reconciliation 的过程 和解的最终目标是 根据这个新
  • iOS开发——在 OC 项目中使用基于 Swift 的 CocoaPods 库

    在 OC 项目中使用基于 Swift 的 CocoaPods 库 随着 Swift 的流行 各种神奇的库也开始有对应的 Swift 版本了 而其中一些更神奇的库却只有 Swift 版本 正巧接手了一个前人用 Swift 写的项目 里面有一个
  • element中checkbox触发change事件时同时传递状态和自定义参数

    element中checkbox触发change事件时同时传递状态和自定义参数 div div
  • 高质量程序设计指南C++ C 代码规范

    这里只是搬运作者对 匈牙利 命名规则做合理简化之后的命名规则 比较适合于 Windows应用程序的开发 建议1 类型名和函数名均以大写字母开头的单词组合而成 例如 class Node 类名 class LeafNode 类名 void D
  • 打开dll文件时模块加载失败,请确保二进制存储在指定的路径中,或者调试它以检查该二进制或相关的.DLL文件是否有问题

    打开dll文件时模块加载失败 请确保二进制存储在指定的路径中 或者调试它以检查该二进制或相关的 DLL文件是否有问题 打开dll文件时模块加载失败 电脑提示请确保二进制存储在指定的路径中 或者调试它以检查该二进制或相关的 DLL文件是否有问
  • Linux命令-fsync

    对fsync命令只做简单介绍 不做详细原理解释 通过man命令查看fsync 2 函数有以下共识 1 fsync函数是属于系统核心函数 2 调用fsync函数会将修改的数据和文件描述符的属性持久化到存储设备中 3 fsync函数将内核缓存的
  • PyQt+moviepy音视频剪辑实战文章目录

    前往老猿Python博文目录 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏 对应的收费专栏为 moviepy音视频开发专栏 一 moviepy基础能力系统介绍 本部分主要以类为单位介绍moviepy相关知识 相关内容主要来自m
  • Linux——gcc和g++的区别和应用

    Windows中我们常用vs来编译编写好的C和C 代码 vs把编辑器 编译器和调试器等工具都集成在这一款工具中 在Linux下我们能用什么工具来编译所编写好的代码呢 其实Linux下这样的工具有很多 但我们只介绍两款常用的工具 它们分别是g
  • C#难点语法讲解之委托---从应用需求开始讲解

    一 委托的定义 委托 Delegate 是存有对某个方法的引用的一种引用类型变量 引用可在运行时被改变 简单解释 变量好控制 方法不好控制 委托可以把方法变成变量 二 例子解释定义 如果我们有一个数组 里面有10个数据 数组就是变量的一种