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

news2025/1/12 16:18:39

一、委托的定义

委托(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,也可以在括号里传递委托,等等等等,,,如果有疑问,请写在评论区,我会继续补充修改的~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/998974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何注册喀麦隆商标?

想象一下&#xff0c;你正在喀麦隆的雨林中寻找宝藏&#xff0c;突然你发现了一个从未被人发现的部落。这个部落的人们用一种独特的图案作为他们的标记&#xff0c;来展示他们的身份和与众不同。这个图案就是喀麦隆的商标&#xff01; 在商业世界中&#xff0c;商标就像这个独特…

开启更高效之路,美创科技暗数据发现和数据分类分级系统全新升级

数字经济时代&#xff0c;数据分类分级作为平衡数据保护和流通利用的基础工作&#xff0c;愈发受到广泛的关注。但面对海量繁杂的数据&#xff0c;如何快速地实现数据梳理与分类分级&#xff0c;对于绝大多数组织而言&#xff0c;并非易事—— ◼︎ 在缺少标准方法和自动化、智…

洁净在线监测系统-天文台日冕仪内洁净环境监测应用

近日&#xff0c;北京中邦兴业技术部在云南完成了一项极具创新性的洁净环境在线监测项目&#xff0c;此次项目的交付&#xff0c;代表着中邦兴业技术的又一次突破与创新&#xff0c;打破了洁净检测仪器在传统行业的应用&#xff0c;成功将激光尘埃粒子计数器LIGHTHOUSE-3016,应…

20230911java面经整理

1.java线程安全的数据类型 Vector&#xff1a;每个方法都有synchronized hashttable&#xff1a;每个方法都有synchronized stack&#xff1a;继承了vector arrayblockingqueue&#xff1a;阻塞队列 concurrentHashMap&#xff1a;使用segment分段锁 concurrentLinkedQueue&am…

flink on yarn任务中文乱码问题解决记录

开发反馈预生产部分部分flink任务出现中文乱码的问题 找到乱码的flink任务所在的节点&#xff0c;登录服务器&#xff0c;执行locale命令&#xff1a; 发现是locale没有设置好&#xff0c;使用vim编辑文本&#xff0c;写入中文都直接乱码 对比其他几台机器&#xff0c;发现主…

【算法】常见位运算总结

目录 1.基础位运算2. 给一个数n&#xff0c;确定它的二进制表示中的第x位是0还是13.将一个数n的二进制表示的第x位修改成14.将一个数n的二进制表示的第x位修改成0、5. 位图的思想6.提取一个数(n)二进制表示中最右侧的17.干掉一个数(n)二进制表示中最右侧的18.位运算的优先级9.异…

瞄准热门需求:7个最受欢迎的跑腿小程序开发灵感

跑腿服务在如今快节奏的社会中扮演着重要角色&#xff0c;而跑腿小程序成为满足人们日常需求的利器。如果你正计划开发一款跑腿小程序&#xff0c;那么把握住最热门的需求绝对是成功的关键。在本文中&#xff0c;我作为跑腿小程序开发领域的专家&#xff0c;将分享七个最受欢迎…

【UIPickerView案例07-省市选择界面数据展示03-城市选择Bug修复 Objective-C语言】

一、咱们先把前面的内容捋一下——省市选择界面: 1.首先呢,我们说,实现一个案例,第一步,先看界面, 1)第一步:先看界面, 2)第二步:分析一下它的基本结构, 3)第三步:搭建界面, 4)第四步:加载数据, 5)第五步:显示数据, 是不是五步, 大的就这五步, …

SpringMVC文件上传与下载、JREBEL使用

目录 一、引言 二、文件的上传 1、单文件上传 1.1、数据表准备 1.2、添加依赖 1.3、配置文件 1.4、编写表单 1.5、编写controller层 2、多文件上传 2.1、编写form表单 2.2、编写controller层 2.3、测试 三、文件下载 四、JREBEL使用 1、下载注册 2、离线设置 一…

“文件的上传与下载:实现与优化“

目录 引言1.文件的上传2.文件的下载3. JRebel安装使用4. 文件批量上传总结 引言 在开发过程中&#xff0c;文件的上传与下载是常见的需求。本篇博客将以CSND为例&#xff0c;介绍文件上传与下载的常见方式&#xff0c;以及如何通过优化提升性能和用户体验。 1.文件的上传 使…

【Python算法Algorithm】专栏导读

1 什么是算法&#xff08;Algorithm&#xff09;&#xff1f; 算法是一组用于解决特定问题或执行特定任务的有序、精确的计算步骤的集合。它可以被认为是一种计算机程序&#xff0c;但更加抽象和数学化。 算法的主要目标是将输入数据转化为所期望的输出结果&#xff0c;而且要在…

华为云云耀云服务器L实例评测|一键部署,畅享高效华为云MySQL

本文目录 一、前言1、云耀云服务器L实例介绍2、产品优势 二、购买/使用1、首界面购买2、根据自己需求购买对应的3、购买成功过后返回首页面---》启动4、重置密码5、远程登录6、输入账户密码提示登陆成功7、为了方便拷贝安装命令&#xff0c;可以选择本地鼠标8、点击复制粘贴9、…

【Spring面试】五、Bean扩展、JavaConfig、@Import

文章目录 Q1、如何在Spring创建完所有的Bean之后做扩展&#xff1f;Q2、Spring容器启动时&#xff0c;为什么先加载BeanFactoryPostProcess?Q3、Bean的生产顺序是由什么决定的&#xff1f;Q4、Spring有哪几种配置方式Q5、JavaConfig是如何替代spring.xml的&#xff1f;Q6、Com…

InVideo AI:用人工智能轻松制作视频

简介&#xff1a; InVideo AI 是一款在线视频制作工具&#xff0c;使用人工智能来帮助用户快速、轻松地制作高质量的视频。该工具提供多种功能&#xff0c;包括&#xff1a; 链接&#xff1a; ai.invideo.io 仪表盘&#xff1a; 历史记录&#xff1a; 创建视频&#xff1a…

【Linux从入门到精通】信号(初识信号 信号的产生)

本篇文章会对Linux下的信号进行详细解释。主要内容是什么是信号、信号的产生、核心转储等问题。希望本篇文章会对你有所帮助。 文章目录 引入 一、初识信号 1、1 生活中的信号 1、2 Linux 下的信号 1、3 信号进程所得的初识结论 二、信号的产生 2、1 用户通过终端输入产生信号 …

2023年9月NPDP产品经理国际认证报名来这里就对了

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

针对电子企业生产特征,提出MES管理系统解决方案

随着全球经济一体化的不断加剧&#xff0c;中国作为一个制造业大国&#xff0c;在电子组装、SMT贴片、PCB组装等领域取得了很大的突破&#xff0c;企业规模和数量随着不断增加&#xff0c;造成成本压力增加、产品生命周期缩短、设备日益复杂且缺少透明度以及不明需求预测&#…

SLAM从入门到精通(编写第一个package)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们安装了ROS环境&#xff0c;接着就可以开始进行ROS程序的开发了。在开发之前&#xff0c;我们有几个概念需要厘清一下。第一个是workspace&…

linux系统中LVM磁盘动态扩容方案

LVM动态扩展方案 信息确认&#xff1a; 磁盘空间确认 挂载磁盘的文件系统确认 lv卷组信息确认 1、确认磁盘已扩容&#xff1a;首先确认物理磁盘&#xff08;vdb&#xff09;已成功扩容至500G。 fdisk -l2、重新分区&#xff1a;将物理磁盘上多出的200G空间格式化为新的分区…

geopandas笔记:汇总连接两个区域的边

比如这样的两个区域&#xff0c;我们想知道从蓝到绿、从绿到蓝都有哪些边 1 读取openstreetmap import osmnx as ox import geopandas as gpdGox.graph_from_place(Singapore,simplifyTrue,network_typedrive)ox.plot_graph(G) 2 得到对应的边的信息 nodes,edgesox.graph_to_…