C#中委托和匿名方法

目录

一、委托

1.委托的实例化

2.委托的调用

3.示例

二、匿名方法


        为了实现方法的参数化,提出了委托的概念,委托是一种引用方法的类型,即委托是方法的引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为;另外,.NET中为了简化委托方法的定义,提出了匿名方法的概念。

一、委托

        C#中的委托(Delegate)是一种引用类型,该引用类型与其他引用类型有所不同,在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。

[修饰符] delegate[返回类型] [委托名称]([参数列表])
其中:
[修饰符]是可选项;
[返回值类型]、关键字delegate和[委托名称]是必需项;
[参数列表]是可选项,用来指定委托所匹配的方法的参数列表。
一个与委托类型相匹配的方法必需满足以下两个条件:
☑ 这二者具有相同的签名,即具有相同的参数数目,并且类型相同,顺序相同,参数的修饰符也相同。 
☑ 这二者具有相同的返回值类型

        委托是方法的类型安全的引用,之所以说委托是安全的,是因为委托和其他所有的C#成员一样,是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。

//一个合法的委托定义
delegate void DelOutput(string s); 

1.委托的实例化

        在声明委托后就可以创建委托对象,即实例化。实例化委托的过程就是将委托与特定的方法进行关联的过程。

        早期的VS,委托对象要使用new关键字创建。VS2022提供用更简单易懂的方法创建委托对象,直接用方法名赋值给委托对象

//创建委托对象,其中DelOutput是委托名
DelOutput del = Console.WriteLine;      //创建委托对象,直接指向Console.WriteLine
del("del()就是Console.WriteLine()");    //委托对象调用方法
del.Invoke("匿名方法被调用");            //委托调用匿名方法del = NamedMethod;                      //修改委托对象指向方法NamedMethod
del("命名方法被调用");                   //委托对象调用命名方法

2.委托的调用

        创建并实例化委托对象后,就可以用该委托代替方法并执行与方法。

3.示例

// 委托
namespace _08_1
{delegate void MyDelegate(string s);public class MyClass{static void Method(string s){Console.WriteLine(s);}public static void Method1(string s){Console.WriteLine(s);}static void Main(string[] args){MyDelegate my = new(Method);    //用方法直接创建实例,可选newmy("江山如此多娇");              //委托调用MyDelegate mydel = Method;      //用方法直接创建实例,不选newmydel("沁园春.雪");              //委托调用mydel = Method1;                //用另一个方法直接修改实例mydel("万里雪飘");               //委托调用}       }
}
//运行结果:
/*江山如此多娇
沁园春.雪
万里雪飘    */

二、匿名方法

        为了简化委托的可操作性,在C#语言中,提出了匿名方法的概念,它在一定程度上降低了代码量,并简化了委托引用方法的过程。

        匿名方法允许一个与委托关联的代码被内联地写入使用委托的位置,这使得代码对于委托的实例很接。除了这种便利之外,匿名方法还共享了对本地语句包含的函数成员的访问。

        匿名方法是C#2.0引入的一个新特性,它允许开发者内联(inline)声明自己的函数代码而无须使用委托函数(delegate)。

        当我们需要一个函数,但又懒得去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。         

匿名方法使用场合:
1. 需要一个临时方法,该方法使用次数极少;
2. 这个方法的代码很短,甚至可能比方法声明都短的情况下;
//匿名方法的语法格式:
delegate([参数列表])
{[代码块]
}
// 委托和匿名方法
namespace Demo
{delegate void DelOutput(string s);          //自定义委托类型,名称DelOutput   class Program{static void NamedMethod(string k)       //命名方法{Console.WriteLine(k);}static void Main(string[] args){          DelOutput del = Console.WriteLine;  //委托的引用指向Console.WriteLinedel("del()就是Console.WriteLine()");del.Invoke("匿名方法被调用");        //委托对象del调用匿名方法,委托也可调用匿名方法Console.Write("\n");del = NamedMethod;                  //委托绑定到命名方法NamedMethoddel("命名方法被调用");               //委托对象del调用命名方法Console.ReadLine();}}
}
/*del()就是Console.WriteLine()
匿名方法被调用命名方法被调用 */

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

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

相关文章

DOM事件的传播机制

DOM事件的传播机制是指当一个事件在DOM树中触发时,它是如何在各个元素之间传播的。DOM事件传播机制分为三个阶段:捕获阶段、目标阶段和冒泡阶段。此外,还有一种常用的技术称为事件委托,它能够简化事件处理程序的绑定和管理。本文将…

入选《数据结构与算法领域内容帮榜》第44名

入选《数据结构与算法领域内容帮榜》第44名

注册并实名认证华为开发者账号

首先 我们访问 https://www.harmonyos.com/ 访问鸿蒙官方网站 右上角 我们点击 登录 然后 我们选择注册 然后 注册方式 有邮箱和手机号的注册 这边 看大家需要 如果像我不怎么登邮箱这种 建议还是选择手机号注册 这里 居住地区 应该就是默认中国吧 然后 手机号 验证码 密码…

[springboot bug] mac 文件读取灵异事件

一开始是想尝试一下spring在过去的xml文件配置bean 的感觉,但是在测试 FileSystemXmlApplicationContext 的时候,反复确认文件路径没有问题,将 / -> \\ 也不起作用,后决定debug一下,发现根因。记录一下&#xff0c…

C#线程 ConcurrentQueue安全队列介绍

https://blog.csdn.net/qq_41230604/article/details/126305068 C#线程安全队列ConcurrentQueue ConcurrentQueue队列是一个高效的线程安全的队列,是Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构。 ConcurrentQueue内部结…

el-select 组件 懒加载 可远程搜索

用于分页数据的懒加载 vueelment 新建elSelct.vue 组件 <template><div><el-select v-el-select-loadmore"loadMore" :value"defaultValue" :loading"loading" :multiple"multiple":placeholder"placeholder&quo…

LeetCode算法心得——使用最小花费爬楼梯(记忆化搜索+dp)

大家好&#xff0c;我是晴天学长&#xff0c;很重要的思想动规思想&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1&#xff09;使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从…

PTA-使用函数求最大公约数

本题要求实现一个计算两个数的最大公约数的简单函数。 函数接口定义&#xff1a; int gcd( int x, int y ); 其中x和y是两个正整数&#xff0c;函数gcd应返回这两个数的最大公约数。 裁判测试程序样例&#xff1a; #include <stdio.h> int gcd( int x, int y ); i…

【数据结构】深入浅出理解链表中二级指针的应用

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 (注:为方便演示本篇使用的x86系统,因此指针的大小为4个字节) 目录 &#x1f4cc;形参的改变不影响实参! 1.调用函数更改整型时传值调用与传址调用的区别 &#x1f38f;传值…

render函数举例

在这段代码中&#xff0c;renderButton是一个对象吗 还有render为什么不能写成render() {} 代码原文链接 <template><div><renderButton /></div> </template><script setup> import { h, ref } from "vue"; const renderButt…

C#,简单修改Visual Studio 2022设置以支持C#最新版本的编译器,尊享编程之趣

1 PLS README & CHAPTER 5 用一个超简单的例子说明各版本 C# 的差异。 使用新版本&#xff08;比如C#.11&#xff09;&#xff0c;当然有一定的好处。我们在写程序的时候一般这样&#xff1a; Visual Studio 2022 默认只能这样写&#xff1a; string imageFile Path.C…

若依框架参数验证

文章目录 一、前端触发参数校验异常1.前端页面2.前端代码 二、后端触发参数校验异常1.前端页面2.后端报错 三、后端自定义参数验证1.添加注解2.触发后端校验 一、前端触发参数校验异常 1.前端页面 输入不符合校验规则的值来触发 2.前端代码 校验规则数组 表单的元素 修…

SQL Server数据库备份与还原

目录 SQL Server DataBase备份 SQL Server DataBase还原 SQL Server DataBase备份 在 SQL Server 中&#xff0c;你可以使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 语句来手动备份数据库。以下是两种方法&#xff1a; 使用 SQL Server Management Studio (SS…

JAVA小游戏“飞翔的小鸟”

第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片 如下&#xff1a; 代码如下&#xff1a; package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width…

Windows下安装Anaconda3并使用JupyterNoteBook

下载安装包 Anaconda官网 进官网&#xff0c;点击下载 自动根据当前系统下载对应的包了&#xff0c;安装包大约1G&#xff0c;喝杯Java耐心等待。 安装 很多人安装C盘&#xff0c;我这里放D盘。 注意&#xff1a;你的文件夹目录一定要不能有空格 然后其他的直接默认install即…

不同路径 递归

int dfs(int i, int j, int m, int n) { if (i > m || j > n) return 0; // 越界了 if (i m && j n) return 1; // 找到一种方法&#xff0c;相当于找到了叶子节点 return dfs(i 1, j, m, n) dfs(i, j 1, m, n); } int u…

在线视频课程教育系统源码/网课网校/知识付费/在线教育系统/在线课程培训系统源码

源码简介&#xff1a; 在线视频课程教育系统源码&#xff0c;作为网课/网校/知识付费/在线教育系统&#xff0c;它有文章付费阅读在线点播自动发货付费阅读VIP会员系统等功能。它是实用的在线课程培训系统源码。 发货100-在线视频课程教育系统&#xff0c;它是一款功能实用的…

优思学院|2024年质量管理的大趋势

2023年我们已经顺利度过了整年的大部分时间&#xff0c;2024年质量管理的趋势和问题在全球范围内都已经引起了关注&#xff0c;或者仍然是企业导航的首要任务。 1. 通货膨胀与质量管理 2023年&#xff0c;全球范围内通货膨胀和严峻的经济状况成为企业最关心的问题之一。尽管物…

Flash可更换声音语音芯片WT588F02系列:优势尽显,应用广泛

在语音技术日益普及的今天&#xff0c;唯创知音推出的Flash可更换声音语音芯片WT588F02系列备受关注。该系列芯片凭借其强大的性能与广泛的应用领域&#xff0c;成为市场上的一颗璀璨明星。本文将分析WT588F02系列的优势&#xff0c;并探讨其应用场景&#xff0c;以展现其在语音…

typedef 的使用

typedef 的定义 typedef 是 C 和 C 中的一个关键字&#xff0c;用于给已有类型定义一个新的名字&#xff0c;与 class、struct、union 和 enum 声明不同&#xff0c;typedef 声明不引入新类型&#xff1b;它们引入现有类型的新名称 typedef 的语法格式 typedef existing_typ…