【C#进阶】C# 匿名方法

这篇具有很好参考价值的文章主要介绍了【C#进阶】C# 匿名方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序号 系列文章
18 【C#进阶】C# 事件
19 【C#进阶】C# 集合类
20 【C#进阶】C# 泛型

前言

📺 hello大家好啊,我是哈桑c,本文为大家介绍 C# 中的匿名方法。


1、什么是匿名方法?

匿名方法顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。

代码示例:(简单演示)

delegate 运算符:

public class SampleAnonymousMethod
{
    static void Main(string[] args)
    {
        Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
        Console.WriteLine(sum(11,22));  
        
        //输出:33
    }
}

Lambda 表达式:

public class SampleAnonymousMethod
{
    static void Main(string[] args)
    {
        Func<int, int> square = x => x * x;
        Console.WriteLine(square(5));
        
        // 输出:25
    }
}

2、delegate 运算符

delegate 运算符创建一个可以转换为委托类型的匿名方法。 匿名方法可以转换为System.Action 和 System.Func<TResult> 等类型,同时指定自定义的参数列表。

代码示例:

Func<string, string, string> hello = delegate (string s1, string s2) { return s1 + s2; };
Console.WriteLine(hello("hello,", "world"));  

运行结果:
【C#进阶】C# 匿名方法
可以看到,即使是一个没有方法名只有方法体的匿名方法也可以正常输出运算结果。

使用 delegate 运算符时,也可以直接省略参数列表,表示创建的匿名方法可以转换为具有任何参数列表的委托类型。

代码示例:

Action greet = delegate { Console.WriteLine("你好!"); };
greet();

Action<int, double> introduce = delegate { Console.WriteLine("这就是世界!"); };
introduce(7, 2.5);

运行结果:
【C#进阶】C# 匿名方法
在上例中可以看到,即可没有声明参数列表的匿名方法在转换为有参数列表的 Action 方法时也可以正常运行。

从 C# 9.0版本开始,可以使用弃元1指定该方法不使用的两个或更多个匿名方法的输入参数。当方法中返回的结果没有任何作用时,就可以使用弃元。

代码示例:

Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4));  

// 输出:42

3、Lambda 表达式

Lambda 表达式的本质也是匿名方法。Lambda 表达式提供了一种简洁和富有表现力的方式来创建匿名函数,可以使用 => 运算符来构造 Lambda 表达式。

Lambda 表达式的定义语法可以总结为如下:

(input-parameters) => { <sequence-of-statements> }
  • input-parameters: 表示输入参数,也即参数列表。
  • sequence-of-statements: 表示表达式语句序列部分。

若要创建 Lambda 表达式,需要在 Lambda 运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。当语句序列部分有且仅有一个表达式时,可以省略大括号的书写。

任何 Lambda 表达式都可以转换为对应的委托类型。 Lambda 表达式可以转换的委托类型由其参数和返回值的类型定义。如果 lambda 表达式不返回值,则可以将其转换为 Action 委托类型之一;否则,可将其转换为 Func 委托类型之一。

代码示例:

// lambda 表达式不返回值,可以将其转换为 Action 委托类型之一 
Action greet = () => { Console.WriteLine("Hello,World"); };   
greet();

// 输出:"Hello,World"
// lambda 表达式返回值,可以转换为 Func 委托类型之一 
Func<int, int> square = x => x * x;
Console.WriteLine(square(5));

// 输出:25

演示 Lambda 表达式有参和无参的两种写法。

有参写法:

Action<string> greet = name => Console.WriteLine($"Hello {name}!";
greet("World");

// 输出: Hello World!  

编写 lambda 时,通常不必为输入参数指定类型,因为编译器可以根据 lambda 主体、参数类型以及 C# 语言规范中描述的其他因素来推断类型。

无参写法:

Action greet = () => Console.WriteLine($"Hello World!");
greet(); 

// 输出: Hello World!  

3.1、Lambda 表达式的自然类型

从 C# 10开始,Lambda 表达式可能具有自然类型,也就是编译器可以根据 Lambda 表达式推断委托类型。但是并非所有 Lambda 表达式都有自然类型,有时候编译器无法推断 s 的参数类型。这时我们就必须声明 Lambda 表达式的类型了。

代码示例:

object parse = (string s) => int.Parse(s); 
Console.WriteLine(parse.GetType());

运行结果:
【C#进阶】C# 匿名方法
从上例中可以看到,编译器顺利推断出了匿名方法的类型 System.Func ,而无需声明具体的方法类型。

代码示例:

var parse = s => int.Parse(s); // ERROR: Not enough type info in the lambda

代码效果:
【C#进阶】C# 匿名方法

3.2、Lambda 表达式的显示返回类型

从 C# 10 开始,使用 Lambda 表达式时可以在输入参数前面显示指定表达式的返回类型,同时必须使用括号把输入参数括起来。

代码示例:

var judge = int (bool b) => b ? 1 : 2;      // int表示返回类型为整数类型
Console.WriteLine(judge(true));

// 输出:1

4、关于匿名方法的总结

匿名方法的优点:

  • 简洁性: 匿名方法可以用更少的代码实现相同的功能。减少代码的复杂性和冗余性,使代码更加简洁。
  • 灵活性: 匿名方法可以作为参数传递给方法,也可以当作返回值返回。
  • 可读性: 匿名方法代码量更少,可以使代码更加清晰易懂,可读性较高。
  • 性能高: 使用 Lambda 表达式可以轻松创建包含异步处理的表达式和语句。

匿名方法的缺点:

  • 重用性低: 匿名方法不能在其它地方进行调用,因此重用性较低。

什么时候需要使用匿名方法:

  • 临时需要一个方法,而且方法使用次数较少。
  • 方法的代码量很少,使用匿名方法显得更加简洁。

点击了解更多匿名方法的使用。


结语

📱 以上就是 C# 匿名方法的介绍啦,希望对大家有所帮助。感谢大家的点赞、收藏、评论和关注。


  1. 弃元: 是一种在应用程序代码中人为取消使用的占位符变量。 ↩︎文章来源地址https://www.toymoban.com/news/detail-439941.html

到了这里,关于【C#进阶】C# 匿名方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 匿名方法和Lambda表达式

    1.匿名方法的演变 匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础。在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建具名方法,从而用匿名方法更为方便。 下面一段代码是声明并使用了一

    2024年02月15日
    浏览(45)
  • C#学习相关系列之匿名方法和Lambda表达式

            匿名方法 顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。( Lambda 表达式 的本质也是 匿名方法

    2024年02月07日
    浏览(54)
  • C#匿名类型

    匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。 可结合使用  new  运算符和对象初始值设定项创建匿名类型。  

    2024年02月11日
    浏览(32)
  • C# 匿名类型之 RuntimeBinderException

    匿名类型在某些场景下使用起来还是比较方便,比如某个类型只会使用一次,那这个时候定义一个 Class 就没有多少意义,完全可以使用匿名类型来解决,但是在跨项目使用时,还是需要注意避免出现 RuntimeBinderException 问题 比如我们有一个 netstandard2.0 类型的类库项目,里面有

    2023年04月13日
    浏览(30)
  • 黑马程序员——javase进阶——day01——匿名对象 , 继承 , 抽象类

    目录: 面向对象回顾 面向对象的核心思想是什么? 现有的类还是先有的对象? Java类的创建? 类中的组成成分? 创建对象所使用的? 创建对象的格式? 调用对象的成员? 定义构造方法的格式? 定义构造方法的特点? 构造方法的作用? 面向对象三大特征是什么? 封装的思想及其作

    2024年01月24日
    浏览(41)
  • C#中var关键字详解:强类型、匿名类型和LINQ查询的妙用!

      在C#中, var 是强类型的,因为它在编译时会根据变量的初始化表达式推断出变量的实际类型,并且一旦确定了类型,就不能再更改。这种类型推断是在编译时进行的,因此代码中的变量在运行时是具有明确定义类型的。 下面是一个简单的示例,说明 var 的强类型特性

    2024年02月01日
    浏览(58)
  • 如何保护IP地址?安全匿名上网的方法

    当互联网成为每个家庭的重要组成部分后,IP地址就成了你的虚拟地址。您的请求从该地址开始,然后 Internet 将消息发送回该地址。那么,您担心您的地址被泄露吗? 对于安全意识高或者某些业务需求的用户,如果您正在寻找保护 IP 地址的方法,您可能想知道如何保护IP地址

    2024年04月10日
    浏览(41)
  • CSharp的lambda表达式匿名类扩展方法

    之前已经写过一些关于委托还有事件的文章,今天就来介绍一下lambda表达式。 首先定义需要的函数以及委托 在.net farmwork 1.0,会这样写我们的匿名函数 在.netframework 2.0,会这样写匿名函数, 增加了一个delegate 在.netframework3.0,去掉了delegate了,在参数后增加了一个=

    2024年03月14日
    浏览(81)
  • 详解DedeCMSv5.5 删除去掉“匿名”评论的方法

    DedeCMS v5.5 删除去掉“匿名”评论的方法是超级简单,利用的是“伪像”  打开 dede/templets/default/ajaxfeedback.htm 找到下列代码,两边加上 代码 改好后变成  打开dede/member/ajax_feedback.php 找到 改成  OK就是这么容易,原理很简单,就是利用 css 的隐藏技巧 有些朋友说直接删除模板中

    2024年02月02日
    浏览(34)
  • C++回调函数 匿名函数,类中的方法做为回调函数

    C++中的回调函数和匿名函数都是函数指针或函数对象的使用形式。下面分别介绍它们的使用方法。 回调函数是一种函数指针,它允许将函数作为参数传递给另一个函数,并在需要时调用它。这种技术通常用于事件处理、异步处理和状态机等应用中。 下面是一个简单的示例,

    2024年02月01日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包