首页 > 编程语言 >C#学习笔记 -- 匿名方法、Lambda表达式

C#学习笔记 -- 匿名方法、Lambda表达式

时间:2023-05-28 10:33:05浏览次数:55  
标签:委托 C# -- 匿名 参数 delegate 方法 Lambda

匿名方法

  • 前面的情况是方法被某个结构或者类的成员, 可以调用方法

  • 如果方法只调用一次, 用来实例化委托, 在这种情况下, 除了创建委托的语法需要, 没有必要创建独立的具名方法, 使用匿名方法即可

  • 匿名方法是实例化委托时内联声明的方法.

class Program
{
    delegate int OtherDel(int InParam);
    static void Main()
    {
        //匿名方法
        OtherDel del = delgate(int x){return x + 20;};
        Console.WriteLine($"{del(5)}");
        Console.WriteLine($"{del(6)}");
    }
}

(1)使用匿名方法

可以在如下地方使用匿名方法

  • 声明委托变量时作为初始化表达式

  • 组合委托时在赋值语句的右边

  • 委托增加事件时在赋值语句的右边

(2)匿名方法的语法

匿名方法包含如下部分

  • delegate关键字

  • 参数列表, 如果语句块没有使用任何参数则可以省略

  • 语句块, 匿名方法的代码

delegate(argList)
{
    statement 
};
A.返回类型

匿名方法不会显式声明返回值, 然而, 实现代码本身的行为必须通过返回一个与委托的返回类型相同的值来匹配委托的返回类型, 如果委托没有返回值, 匿名方法就不能返回值

//声明有返回值委托
delegate Type MyDelegate(argList);
//声明匿名方法
MyDelegate myDelegate = delegate(argList)
{
    return NotVoidMethod();
};
//声明无返回委托
delegate void MyDelegate(argList);
//声明匿名方法
MyDelegate myDelegate = delegate(argList)
{
    voidMethod();
};
B.参数

除了数组参数, 匿名方法的参数列表必须在如下3方面与委托匹配

  • 参数数量

  • 参数类型及位置

  • 修饰符

可以通过圆括号为空, 或者省略圆括号, 来简化匿名方法的参数列表, 但必须满足如下两个条件

  • 方法的参数列表不包含任何out参数

  • 匿名方法不用任何参数

  • 用于简化, 和委托的参数列表无关

delegate void SomeDel(int x);
SomeDel SDel = delegate
{
    Console.WriteLine("hi");
}
C.params参数

如果委托声明的参数列表包含了params参数, 那么匿名的方法的参数列表将被忽略params关键字

delegate void SomeDel(int x, params int[] Y);
SomeDel mDel = delegate(int X, int[] Y)
{
    ...    
}

(3)变量和参数的作用域

参数以及声明在匿名方法内部的局部变量的作用域限制在实现代码的主体内

A.外部变量

与委托的具体方法不同, 匿名方法也可以访问他们外围作用域的局部变量和环境

  • 外围作用域的变量叫做外部变量

  • 用在匿名方法实现代码中的外部变量被称为方法捕获

B.方法捕获变量的声明周期的扩展
  • 只要方法捕获变量是委托的一部分, 即使变量已经离开了作用域, 方法捕获外部变量也会一直有效

  • 由于匿名方法在委托的环境里保留的方法捕获变量, 当委托执行时候, 变量也可以在委托中使用

2、Lambda表达式

  • 使用Lambda表达式来替代匿名方法

  • 如果先引入了Lambda表达式, 就不会有匿名方法

匿名方法转换为Lambda表达式步骤

  • 删除delegate关键字

  • 在参数类表和匿名方法主体之间防止哦Lambda运算符, Lambda运算符读作goes to

MyDel del = delgate(int x){return x + 1;};
MyDel del = (int x) => {return x + 1;};

进一步简化Lambda表达式

  • 编译器还可以从委托的声明中知道委托参数的类型, 因此Lambda表达式允许省略类型参数

    • 带有类型的参数列表称为显式类型

    • 省略类型的参数列表称为隐式类型

  • 如果只有一个隐式类型参数, 可以省略两端的括号

  • Lambda允许表达式的主体是语句块或表达式, 如果语句块包含了一个返回语句, 可以将语句块替换为return关键字后的表达式

MyDel del = delgate(int x){return x + 1;};
MyDel le1 = (int x) => {return x + 1;};
MyDel le2 = (x) => {return x + 1;};
MyDel le3 = x => {return x + 1;};
MyDel le4 = x => x + 1;

关于Lambda表达式的参数列表要点

  • Lambda表达式的参数列表中的参数必须在参数数量、类型和位置上与委托相匹配

  • 表达式的参数列表中不一定需要包含类型(隐式类型), 除非委托有ref和out参数, 此时必须注明类型(显式类型)

  • 如果只有一个参数, 并且是隐式类型的, 则两端的圆括号可以省略, 否则必须有括号

  • 如果没有参数, 必须使用一组空的圆括号

标签:委托,C#,--,匿名,参数,delegate,方法,Lambda
From: https://www.cnblogs.com/phonk/p/17437880.html

相关文章

  • 用Java语言和Springboot框架实现宿舍管理系统
    技术架构技术框架:SpringBoot+SpringMVC+MyBatis+Layui+Mysql5.7+Axios+Echarts+POI运行环境:jdk8+IntelliJIDEA+maven+宝塔面板宝塔部署教程回到IDEA,点击编辑器右侧maven图标,执行package,完成后就会在根目录里生成一个target目录,在里面会打包出一个jar文件......
  • 唯一约束
    1、唯一性约束(unique),它可以使某个字段的值不能重复。如:email不能重复1.1创建一个email不重复的表1.2查看表结构desct_student;1.3插入一条数据insertintot_student(student_id,student_name,sex,birthday,email,classes_id)values(1001,'zhangsan','m','1998-12-12','123456@......
  • docker存储
    1、概念1.1、容器本地存储与Docke存储驱动容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储。采用的是联合文件系统。通过存储驱动进行管理。容器本地存储空间:分层结构构成,由一个可写容器层和若干只读的镜像层组成。联合文件系统:Docker的一种底层技术,由存储驱动(StorageD......
  • 算法
    练习1-递归与分治铺砖对于一个2行N列的走道。现在用1×2,2×2的砖去铺满。问有多少种不同的方式。下图是一个2行17列的走道的某种铺法。讲解视频:https://blog.csdn.net/Keven_11/article/details/119645827算法思路: 主要还是一个拆分的思想,前两列的摆法无法拆解,所以事先......
  • 【LeetCode】704.二分查找
    704.二分查找解析:思路一:暴力解法,直接遍历,从头开始查找,如果找到直接返回下标,找不到返回-1。classSolution{public:intsearch(vector<int>&nums,inttarget){for(inti=0;i<nums.size();i++){if(nums[i]==target)......
  • PS新手教程-如何使用PS把双人照变成单人照?
    如何使用PS把双人照变成单人照?给大家介绍如何使用PS把双人照变成单人照,一起来看看吧。1.打开PS,导入素材图片,用套索工具将合照其中一人圈起来。2.点击编辑-内容识别填充,把不被识别的人物擦去。3.按回车键即可,就从双人照变成单人照啦。以上就是如何使用PS把双人照变成单人照的全部内容......
  • win11改回win10右键菜单
    反人类Win11之文件右键菜单改回Win10GhostIT男​笔电/DIY配置分析&推荐|友好的交流从关注开始|欢迎私信 163人赞同了该文章使用win11,最大的问题是什么,是右键菜单很多时候需要点两次,实在是反人类,太麻烦了。必须使用“显示更多选项”的右键菜单:这......
  • DragGAN:拽一拽关键点就能让狮子张嘴&大象转身
    这两天,一段AI修图视频在国内外社交媒体上传疯了。不仅直接蹿升B站关键词联想搜索第一,视频播放上百万,微博推特也是火得一塌糊涂,转发者纷纷直呼“PS已死”。怎么回事?原来,现在P图真的只需要“轻轻点两下”,AI就能彻底理解你的想法!小到竖起狗子的耳朵:大到让整只狗子蹲下来,甚至让......
  • 深入了解平均精度(mAP):通过精确率-召回率曲线评估目标检测性能
    平均精度(AveragePrecision,mAP)是一种常用的用于评估目标检测模型性能的指标。在目标检测任务中,模型需要识别图像中的不同目标,并返回它们的边界框(boundingbox)和类别。mAP用于综合考虑模型在不同类别上的准确度和召回率。基本知识IOU(IntersectionOverUnion)是一种基于Jaccard......
  • [nginx]lua控制请求头
    前言nginx原生提供expires、add_header两个指令控制请求头,在LuaAPI中也有类似的指令。添加请求头指令:ngx.req.set_header语法:ngx.req.set_header(header_name,header_value)环境:set_by_lua*、rewrite_by_lua*、access_by_lua*、content_by_lua*、header_filter_by_lua*、b......