C#匿名方法介绍Action、Func、柯里化Currying

在C#中,匿名方法是一种没有名称的方法,可以被用作委托的参数或者赋值给委托类型的变量。匿名方法主要有两种形式:匿名方法和lambda表达式。

一、匿名方法

匿名方法是C# 2.0引入的特性。匿名方法用delegate关键字定义,它可以有参数,也可以没有参数。如下示例:

namespace niming_function
{internal class Program{static void square2(int num){int result = num * num;Console.WriteLine(result);}static void Main(string[] args){Console.WriteLine("匿名函数");Action<int> square = delegate (int num){int result = num * num;Console.WriteLine(result);};square(3);  // 输出:9square2(3); // 输出:9}}
}

在这个示例中,我们创建了一个匿名方法square,该方法接受一个整数,计算它的平方,并将结果打印到控制台。然后我们将这个匿名方法赋值给Action<int>类型的变量square,并调用这个方法。匿名方法square等同于类成员方法square2,只是square是在方法里面定义的方法,写法和square2有差别。

Action的解释

在C#中,Action是一个委托(delegate)。它被用来表示一个没有返回值且可能带有任意数量参数的方法。这种方法被封装在一个 Action 委托实例中,然后可以像普通方法一样被调用。Action 委托可以带有类型参数,以此来定义参数的类型。

匿名函数是没有名字的方法或函数。它们常常被用作参数传递给其他方法,或者用来定义事件处理程序。在C#中,匿名函数常常通过Func和Action委托来表示。

总结:
Action表示的匿名方法没有返回值,Func表示的匿名方法有返回值。

接受两个int参数的Action委托的例子

Action<int, int> addAndPrint = (x, y) =>
{int result = x + y;Console.WriteLine(result);
};addAndPrint(3, 5);  // 输出 8

接受任意参数的Action委托的例子

Action<object[]> printAll = args =>
{foreach (var arg in args){Console.WriteLine(arg);}
};printAll(new object[] { "Hello, world!", 42, DateTime.Now });

Func的用法

//如果你的匿名函数有返回值,那么你应该使用 Func 委托而不是 Action 委托。
//Func 委托用来表示有返回值的函数,最后一个类型参数表示返回类型。
Func<int, int, int> addFunc = (x, y) => x + y;
int result = addFunc(3, 5);
Console.WriteLine(result);  // 输出 8

在上述例子中,addFunc 是一个 Func 委托,它接受两个 int 类型的参数并返回一个 int 类型的结果。这个委托被指定了一个匿名函数,即 (x, y) => x + y,这个匿名函数接受两个参数并返回它们的和。

需要注意的是,Action 和 Func 委托都可以接受类型参数来指定参数的类型,但 Func 委托的最后一个类型参数总是用来表示返回类型的。Action 委托则没有返回值。

全部代码如下:

namespace niming_function
{internal class Program{static void square2(int num){int result = num * num;Console.WriteLine(result);}static void Main(string[] args){Console.WriteLine("匿名函数");Action<int> square = delegate (int num){int result = num * num;Console.WriteLine(result);};square(3);  // 输出:9square2(3); // 输出:9// 下是一个接受两个int参数的Action委托的例子Action<int, int> addAndPrint = (x, y) =>{int result = x + y;Console.WriteLine(result);};addAndPrint(3, 5);  // 输出 8// 下是一个接受任意参数的Action委托的例子Action<object[]> printAll = args =>{foreach (var arg in args){Console.WriteLine(arg);}};printAll(new object[] { "Hello, world!", 42, DateTime.Now });//如果你的匿名函数有返回值,那么你应该使用 Func 委托而不是 Action 委托。//Func 委托用来表示有返回值的函数,最后一个类型参数表示返回类型。Func<int, int, int> addFunc = (x, y) => x + y;int result = addFunc(3, 5);Console.WriteLine(result);  // 输出 8}}
}

运行结果如下:
匿名函数
9
9
8
Hello, world!
42
2023/11/17 21:00:14
8

二、Lambda 表达式

Lambda 表达式是C# 3.0引入的特性,它提供了一种更简洁的方式来写匿名方法。Lambda表达式有两种形式:表达式Lambda和语句Lambda。如下示例:

// 表达式 Lambda
Func<int, int> squareExpression = num => num * num;
Console.WriteLine(squareExpression(5));  // 输出:25// 语句 Lambda
Action<int> squareStatement = num =>
{int result = num * num;Console.WriteLine(result);
};
squareStatement(5);  // 输出:25

在这个示例中,我们使用Lambda表达式创建了两个匿名方法,它们都接受一个整数,计算它的平方,并将结果打印到控制台。然后我们将这些匿名方法分别赋值给Func<int, int>Action<int>类型的变量,并调用这些方法。

总的来说,匿名方法提供了一种方便的方式来创建和使用小的、简单的方法,而不需要定义一个完整的方法。

三、柯里化

"柯里化"是一种编程技术,由 Haskell Curry 提出,因此得名。它是将一个带有多个参数的函数转变为一系列使用一个参数的函数的过程。例如,一个接受三个参数的函数f(x, y, z)可以被柯里化为f(x)(y)(z)。这种技术在函数式编程中非常常见,可以让你创建更灵活的函数,以及支持部分应用(partial application)和函数组合(function composition)等高级功能。

在 C# 中,你可以使用 Func 委托来实现柯里化。以下是一个三元函数柯里化的示例:

using System;public static class CurryExtensions
{public static Func<T1, Func<T2, Func<T3, TResult>>> Curry<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> func){return a => b => c => func(a, b, c);}
}class Program
{static void Main(){Func<int, int, int, int> addThreeNumbers = (x, y, z) => x + y + z;var curriedAdd = addThreeNumbers.Curry();var addFiveAndSix = curriedAdd(5)(6);Console.WriteLine(addFiveAndSix(7));  // Prints 18}
}

在这个示例中,CurryExtensions 类定义了一个扩展方法 Curry,它接收一个三元函数并返回一个柯里化的函数。然后,我们在 Main 方法中创建了一个 addThreeNumbers 函数,并将其柯里化。最后,我们调用柯里化的函数并打印结果。

这种技术的优点是它允许你创建更灵活的函数,并进行部分应用。例如,如果你有一个需要三个参数的函数,但你只有两个参数,你可以部分应用这个函数,返回一个新的函数,只需要一个参数就可以完成计算。这种技术在函数式编程中非常有用,因为它可以让你创建更复杂、更强大的函数。

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

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

相关文章

Figma 插件学习(一)

一.插件介绍 插件在文件中运行&#xff0c;执行一个或多个用户操作&#xff0c;并允许用户自定义其体验或创建更高效的工作流程。 插件通过专用插件API与Figma的编辑器交互。还可以利用外部Web API。 1.插件API 插件API支持读写功能&#xff0c;允许查看、创建和修改文件的…

傅里叶级数@正弦级数和余弦级数@奇偶延拓和周期延拓

文章目录 abstract正弦级数和余弦级数周期延拓奇偶延拓对延拓函数做区间限制 小结偶延拓方法奇延拓方法 例 abstract 傅里叶级数正弦级数和余弦级数奇偶延拓和周期延拓 正弦级数和余弦级数 奇函数的傅里叶级数是只含有正弦项的正弦级数偶函数的傅里叶级数是只含有余弦项的余…

打破传统束缚,释放服务潜能:本地生活服务商聚合系统引领行业新风向!

本地生活服务商聚合系统是一种集合多平台、多项目的创新型服务系统&#xff0c;它打破了传统服务商系统的一对一限制&#xff0c;为创业者和运营商带来了诸多优势。小多将深入探讨本地生活服务商聚合系统的优势。 随着互联网的快速发展&#xff0c;本地生活服务也迎来了蓬勃的发…

Mongodb命名和文档限制

选用mongodb时&#xff0c;需要了解与mongodb数据大小&#xff0c;命名上的限制。针对这些限制&#xff0c;本文针对这些限制进行翻译整理。 BSON文档 mongodb中的数据记录&#xff0c;按照文档的形式保存。文档保存在一种类似于JSON的BSON结构中。Mongodb对BSON做了一些限制…

RLlib六:实战用户环境

github源码 自定义用户gymnasium环境使用tune搜索不同的learning rate""" Example of a custom gym environment. Run this example for a demo.This example shows the usage of:- a custom environment- Ray Tune for grid search to try different learni…

el-tree 与table表格联动

html部分 <div class"org-left"><el-input v-model"filterText" placeholder"" size"default" /><el-tree ref"treeRef" class"filter-tree" :data"treeData" :props"defaultProp…

linux gdb调试

安装gdb yum install gdb -y 查看dump文件所在路径&#xff1a; 可通过 cat /proc/sys/kernel/core_pattern命令获取dump目录路径 gdb调试&#xff1a; 可执行文件为 xxx&#xff08;例如&#xff1a;main&#xff09;&#xff0c;结合其运行时产生的dump文件进行调试 命令&a…

彻底删除的文件如何恢复?分享正确方法!

“求救&#xff01;我在清理电脑的过程中&#xff0c;把一些比较久远的文件彻底删除了。但是我突然想起好像有些非常重要的数据也一同被删掉了&#xff0c;这可怎么办&#xff1f;有方法恢复彻底删除的文件么&#xff1f;” 在日常使用电脑的过程中&#xff0c;很多用户或许都会…

机器学习-笔记

绪论 参考期刊 ICCV 偏向视觉CVPR 偏向MLIAAA AI原理ICML 参考链接 CSDN 机器学习知识点全面总结 课堂内容学习-0912-N1 对于特征提取&#xff0c;简而言之就是同类聚得紧&#xff0c;异类分得开&#xff1b;   detection研究的是样本二分类问题&#xff0c;即分为正样本…

【C语言】——三道基础程序练习

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Oracle 数据库中 查询时如何使用日期(时间)作为查询条件

在 Oracle 数据库中&#xff0c;可以使用日期&#xff08;时间&#xff09;作为查询条件来筛选数据。 格式化日期的三种方式 方式一: 关键字 DATE 使用关键字DATE&#xff0c; 仅表示日期类型&#xff0c;并不包含时间信息 方式二&#xff1a;关键字TIMESTAMP 使用关键字TI…

Rockdb简介

背景 最近在使用flink的过程中&#xff0c;由于要存储的状态很大&#xff0c;所以使用到了rockdb作为flink的后端存储&#xff0c;本文就来简单看下rockdb的架构设计 Rockdb设计 Rockdb采用了LSM的结构&#xff0c;它和hbase很像&#xff0c;不过严格的说&#xff0c;基于LS…

设计模式-行为型模式-责任链模式

一、什么是责任链模式 责任链模式是一种设计模式。在责任链模式里&#xff0c;很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递&#xff0c;直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求&…

Lavarel定时任务的使用

系统为window 执行命令(执行一次命令只会根据当前时间运行一次定时任务) php artisan schedule:run创建一个任务类(在Jobs文件夹下面) <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contract…

VS2019编译安装GDAL(C++)程序库

一、GDAL简介 GDAL&#xff0c;全称Geospatial Data Abstraction Library&#xff0c;即地理空间数据抽象库&#xff0c;是一个在X/MIT许可协议下读写空间数据的开源库&#xff0c;可以通过命令行工具来进行数据的转换和处理。而在调用中我们常用的OGR&#xff08;OpenGIS Simp…

Talk2BEV: Language-enhanced Bird’s-eye View Maps for Autonomous Driving

论文标题为“Talk2BEV: Language-enhanced Bird’s-eye View Maps for Autonomous Driving”&#xff0c;主要介绍了一种新型的视觉-语言模型&#xff08;LVLM&#xff09;界面&#xff0c;用于自动驾驶情境中的鸟瞰图&#xff08;BEV&#xff09;映射。以下是论文的主要内容概…

MATLAB中std函数用法

目录 语法 说明 示例 矩阵列的标准差 三维数组的标准差 指定标准差权重 矩阵行的标准差 数组页的标准差 排除缺失值的标准差 标准差和均值 标准差 std函数的功能是得到标准差。 语法 S std(A) S std(A,w) S std(A,w,"all") S std(A,w,dim) S std(A…

2311rust,到38版本更新

1.35.0稳定版 此版本亮点是分别为Box<dyn FnOnce>,Box<dyn FnMut>和Box<dyn Fn>实现了FnOnce,FnMut和Fn闭包特征. 此外,现在可按不安全的函数指针转换闭包.现在也可无参调用dbg!. 为Box<dyn Fn*>实现Fn*装饰特征. 以前,如果要调用在盒子闭包中存储的…

nvm切换node后,没有npm

当我们想要在不同的 Node.js 版本之间切换的时候&#xff0c;通常会使用 nvm&#xff08;Node Version Manager&#xff09; 来完成。但是&#xff0c;当我们在使用 nvm 切换 Node.js 版本的时候&#xff0c;可能会遇到没有 npm 的情况。这种情况通常发生在我们在新环境或者重新…

Android---Gradle 构建问题解析

想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助&#xff0c;Android 工程师使用 Gradle 的门槛不算太高&#xff0c;基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改&#xff0c;就都能满足项目要求。但是&am…