【.NET Core】匿名方法与扩展方法

【.NET Core】匿名方法与扩展方法

文章目录

  • 【.NET Core】匿名方法与扩展方法
    • 一、匿名方法
      • 1.1 匿名方法定义
      • 1.2 通过Delegate关键字创建委托匿名方法
      • 1.3 通过Action关键字创建无返回值的匿名方法
      • 1.4 通过Func关键字创建有返回值的匿名方法
      • 1.5 使用Lambda表达式表示匿名方法
    • 二、扩展方法
      • 2.1 扩展方法定义
      • 2.2 编译时的扩展方法
      • 2.3 值类型如何定义扩展方法
      • 2.4 如何定义和调用扩展方法

一、匿名方法

1.1 匿名方法定义

委托是用于引用与其具有相同标签的方法。可以使用委托对象调用可由委托引用的方法。匿名方法(Anonymous methods)提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。在匿名方法中不需要指定返回类型,它是从方法主体内的return语句推断而来。

1.2 通过Delegate关键字创建委托匿名方法

匿名方法可以通过delegate来声明一个委托的匿名方法声明。

示例如下:

public class Program
{//无返回值的匿名方法public delegate void MethodParameterFree(string name);MethodParameterFree MethdFree = delegate (string name){Console.WriteLine($"无参的匿名方法,输出值={name}");};//有返回值,且返回值为string匿名方法public delegate string MethodParameterReturnString(string name);MethodParameterReturnString methodParameterReturn = delegate (string name){return $"有参的匿名方法,返回值为:{name}";};public static void Main(string[] args){Program program= new Program();program.MethdFree("MethodParameterFree.");string response= program.methodParameterReturn("ReturnValue");Console.WriteLine(response);}     
}

1.3 通过Action关键字创建无返回值的匿名方法

示例如下:

Action<string> MethdFree = (string name)=>
{Console.WriteLine($"无参的匿名方法,输出值={name}");
};
public static void Main(string[] args)
{Program program= new Program();program.MethdFree("MethodParameterFree.");
}

1.4 通过Func关键字创建有返回值的匿名方法

Func<string,int,string> MethdFunc = (string name,int age)=> $"Func匿名方法,姓名={name},年龄={age}";
public static void Main(string[] args)
{Program program= new Program();string response=   program.MethdFunc("Goyeer",39);Console.WriteLine(response);
}

隐式输入参数匿名函数

Func<string,int,string> MethdFunc = (name,age)=> $"Func匿名函数,姓名={name};年龄={age}";
public static void Main(string[] args)
{Program program= new Program();string response=   program.MethdFunc("Goyeer",39);Console.WriteLine(response);
}

使用弃元指定Lambda表达式中未使用的参数

Func<string,int,string> MethdFunc = (_,_)=> $"Func弃元,处理未使用匿名方法。";
public static void Main(string[] args)
{Program program= new Program();string response=   program.MethdFunc("Goyeer",39);Console.WriteLine(response);
}

1.5 使用Lambda表达式表示匿名方法

public static void Main(string[] args)
{var RetrunValueMethod = (string name, int age) => { Console.WriteLine($"Lambda表达式无返回值匿名方法,姓名={name},年龄={age}");};RetrunValueMethod("GOYEER",42);//Lambda有返回值var MethdFunc = (string name, int age) => $"Func Lambda表达式表示匿名方法,姓名={name},年龄={age}。";Console.WriteLine(MethdFunc("Gogeer",39));
}

二、扩展方法

2.1 扩展方法定义

扩展方法使用你能够向现有类型添加方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型。扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。调用扩展方法与调用在类型中定义方法没有明显区别。

最常用的扩展方法是LINQ标准查询运算符,它将查询功能添加到现有的System.Collections.IEnumerableSystem.Collections.Generic.IEnumerable<T>类型。

扩展方法被定义为静态方法,它们是通过实例方法语法进行调用的。它们的第一参数指定方法操作的类型。参数前面是此修饰符。仅当你使用using指令将命名空间显示导入到源代码中之后,扩展方法才位于范围中。

2.2 编译时的扩展方法

可以使用扩展方法来扩展类或接口,但不能重写扩展方法。与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。编译时,扩展方法的优先级总是比类型本身中的实例方法底。如果某个类型具有一个名为Process(int i)的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。如果未找到任何匹配的方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。

2.3 值类型如何定义扩展方法

使用struct类型扩展预定义类型可能很困难,因为他们已通过值传递给方法。这意味着将对结构的副本进行任何结构更改。扩展方法退出后,将不显示这些更改。可以将ref修饰符添加到第一个参数,使其成为ref扩展方法。ref关键字可以在this关键字之前或之后显示,不会有任何语义差异。添加ref修饰符表示第一个参数是按引用传递的,在这种情况下,可以编写扩展方法更改要扩展的值类型。扩展方法仅允许值类型或受结构约束的泛型类型作为ref扩展方法的第一参数。

public static class IntExtensions
{public static void Increment(this int number)=> number++;public static void RefIncrement(this ref int number)=> number++;
}public static class IntProgram
{public static void Test(){int x = 1;x.Increment();Console.WriteLine($"x is now {x}"); //输出结果: x is now 1x.RefIncrement();Console.WriteLine($"x is now {x}"); //输出结果: x is now 2}
}

2.4 如何定义和调用扩展方法

  1. 定义包含扩展方法的静态类。此类必须对客户端代码可见。
  2. 将扩展方法实现为静态方法,并且使用可见性至少与所在类的可见性相同。
  3. 此方法的第一个参数指定方法所操作的类型;此参数前必须加上this修饰符,值类型需要变更变量值的需要在this后ref关键字。
  4. 在调用代码中,添加 using 指令,用于指定包含扩展方法类的命名空间
  5. 和调用类型的实例方法那样调用这些方法。

第一个参数并不是由调用代码指定,因为它表示要在其上应用运算符的类型,并且编译器已经知道对象的类型。

示例

public static class MyExtensions
{public static int WordCount(this string str){return str.Split(new char[] { ' ', '.', '?' },StringSplitOptions.RemoveEmptyEntries).Length;}
}

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

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

相关文章

反射讲解(有图有真相)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、反射是什么&#xff1f;二、反射有啥好处&#xff1f;1. 没反射2. 有反射 三、反射的常用方法1. 获取 Class 对象&#xff1a;2. 获取类的构造方法&#xf…

python统计学-两个总体均值差的区间估计

简介 两个总体均值差的区间估计是指&#xff0c;在给定的置信水平下&#xff0c;估计两个总体均值差的置信区间。两个总体均值差的区间估计的公式为&#xff1a; X ‾ 1 − X ‾ 2 t α / 2 , n 1 n 2 − 2 s 1 2 n 1 s 2 2 n 2 \overline{X}_1 - \overline{X}_2 \pm t_{\a…

数组的声明

概要&#xff1a; 数组的声明分为三个部分 第一部分&#xff1a;数组中元素的数据类型 第二部分&#xff1a;数组名 第三部分&#xff1a;数组标识符(方括号)和数组大小 一、测试代码 #include<stdio.h> int main() {int arr_int[10];char* arr_str[10];arr_in…

软件测试/测试开发丨Selenium环境安装配置

一、selenium 环境配置 1、下载浏览器 目前比较常用的浏览器是 Google Chrome 浏览器&#xff0c;所以本教程以 chrome 为主&#xff0c;后面简介一下其他浏览器的环境配置。 chrome 下载: www.google.cn/chrome/ 2、chromedriver 环境配置 chromedriver 是chromedriver提…

R语言【base】——sprintf():接受格式化文本和变量值来搭建字符型向量。

Package base version 4.2.0 Parameters sprintf(fmt, ...)gettextf(fmt, ..., domain NULL, trim TRUE) 参数【fmt】&#xff1a;格式字符串的字符向量&#xff0c;每个字符串最多 8192 个字节。 参数【...】&#xff1a;要传递给参数【fmt】的值。仅支持逻辑向量、整数向…

【C++】引用详解

前言 在学习C语言时&#xff0c;我们通常会遇到两个数交换的问题&#xff0c;为了实现这一功能&#xff0c;我们会编写一个经典的Swap函数&#xff0c;如下所示&#xff1a; void Swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; } 然而&#xff0c;这个Swap函数看起来可…

CEC2017(Python):五种算法(SSA、RFO、OOA、PSO、GWO)求解CEC2017

一、5种算法简介 1、麻雀搜索算法SSA 2、红狐优化算法RFO 3、鱼鹰优化算法OOA 4、粒子群优化算法PSO 5、灰狼优化算法GWO 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem defin…

Kubernetes 学习总结(43)—— Kubernetes 从提交 deployment 到 pod 运行的全过程

当用户向 Kubernetes 提交了一个创建 deployment 的请求后&#xff0c;Kubernetes 从接收请求直至创建对应的 pod 运行这整个过程中都发生了什么呢&#xff1f; kubernetes 架构简述 在搞清楚从 deployment 提交到 pod 运行整个过程之前&#xff0c;我们有先来看看 Kubernete…

Ubuntu 20.04使用Livox Mid-360

参考文章&#xff1a; Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一&#xff1a;Livox mid 360驱动安装与测试 前言&#xff1a; Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。 1. 安装Livox-SDK2 参…

golang 中判断结构体中某一个属性是否存在(以区分零值)

原问题地址&#xff1a;validate-struct field if it exists 有定义结构 package mainimport ("fmt""encoding/json" )type User struct {Name string json:"name,omitempty"Username *string json:"username,omitempty"Email …

自然语言处理1——探索自然语言处理的基础 - Python入门篇

目录 写在开头1. 介绍自然语言处理的基本概念1.1 NLP的核心目标1.2 常见的NLP任务1.3 应用场景详细介绍1.3.1 医疗保健1.3.2 金融领域1.3.3 教育领域1.3.4 社交媒体分析2. Python中常用的自然语言处理库简介2.1 NLTK (Natural Language Toolkit)2.2 Spacy2.3 Transformers2.4 T…

RabbitMQ是做什么的

rabbitMQ是做异步通讯的。用于解决同步同讯的拓展性差&#xff0c;级联失败的问题。 异步调用方式其实就是基于消息通知的方式&#xff0c;一般包含三个角色:。 消息发送者:投递消息的人&#xff0c;就是原来的调用方 消息代理:管理、暂存、转发消息&#xff0c;你可以把它理…

软件测试/测试开发丨Python常用数据结构-列表list

列表的定义 列表是有序的可变元素的集合&#xff0c;使用中括号[ ]包围&#xff0c;元素之间用逗号分隔&#xff1b;列表是动态的&#xff0c;可以随时扩展和收缩&#xff1b;列表是异构的&#xff0c;可以同时存放不同类型的对象&#xff1b;列表允许出现重复的元素。 列表的…

六、从0开始卷出一个新项目瑞萨RZN2L之loader app分离工程优化

六、loader app分离工程 6.1 概述 6.2 官方资料与不足 6.3 loader app分离工程的优化 6.3.1 自动调节合并appsection 6.3.2 loader中使用外设 6.3.3 app使用sram mirror 6.3.4 sram atcm同时使用 六、从0开始卷出一个新项目之瑞萨RZN2L loader…

深入浅出理解转置卷积Conv2DTranspose

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;A guide to convolution arithmetic for deep learning github源码&#xff1a;Convolution arithmetic bilibili视频&#xff1a;转置卷积&#xff08;transposed convolution&#xff09; 转置…

STM32入门教程-2023版【3-2】点亮LED灯之库函数介绍

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 二、正式点亮一个LED灯 操作STM32的GPIO需要三个步骤&#xff1a; 1.使用RCC打开GPIO的时钟&#…

基于策略模式和简单工厂模式实现zip、tar、rar、7z四种压缩文件格式的解压

推荐语 这篇技术文章深入探讨了基于策略模式和简单工厂模式实现四种常见压缩文件格式的解压方法。通过阅读该文章&#xff0c;你将了解到如何利用这两种设计模式来实现灵活、可扩展的解压功能&#xff0c;同时适应不同的压缩文件格式。如果你对设计模式和文件处理感兴趣或刚好…

算法题Python常用内置函数、方法、技巧汇总(其八:推导式)

文章目录 推导式列表推导式元组推导式集合推导式字典推导式 华为OD算法/大厂面试高频题算法练习冲刺训练 推导式 python中的推导式是一种独特的数据处理方式&#xff0c;可以从一个数据序列构建另一个新的数据序列。可以简单理解为for循环语句(if条件语句)的简写版本&#xff…

Springboot配置http-Only

项目框架 jdk1.8、springboot2.5.10 情况一 项目中未使用&#xff08;权限认证框架&#xff1a;Sa-Token&#xff09; application.yml文件内增加配置 server.servlet.session.cookie.http-onlytrueserver.servlet.session.cookie.securetrue (此条配置建议也加上) 情况二…

Flink去重计数统计用户数

1.数据 订单表&#xff0c;分别是店铺id、用户id和支付金额 "店铺id,用户id,支付金额", "shop-1,user-1,1", "shop-1,user-2,1", "shop-1,user-2,1", "shop-1,user-3,1", "shop-1,user-3,1", "shop-1,user…