-
匿名方法
-
C# 匿名方法定义
C# 中的匿名方法是没有名称的方法,它在声明和初始化时就被使用。通常与委托(delegate)一起使用,以便将代码块作为参数传递给其他方法。匿名方法可以转换为System.Action 和 System.Func<TResult> 等类型,同时指定自定义的参数列表。匿名方法通常表现为使用delegate运算符和Lambda表达式。
-
定义方式:
- 使用
delegate
关键字声明委托类型。-
MyDelegate m = delegate(string x) { Console.WriteLine("匿名方法: {0}", x); }
-
- 在需要委托实例的地方,直接定义匿名方法并赋值。
-
MyDelegate m = x => Console.WriteLine("匿名方法: {0}", x);
-
- 使用
- 使用场景
- 临时需要小段逻辑,但不想单独定义一个完整的方法。
- 作为事件处理器或回调方法。
- 在需要委托类型但不想显式定义方法时。
-
缺点
- 可读性差:由于匿名方法没有具体的名称,当代码量较大时,可能会降低代码的可读性,使得其他开发者难以理解和维护。
- 难以重用:匿名方法通常只在其定义的作用域内有效,无法在其他地方重用,这可能导致代码冗余,特别是在需要多次执行相同逻辑时。
- 调试困难:在调试过程中,由于匿名方法没有名称,可能难以在调试器中直接定位到具体的匿名方法实现,增加了调试的难度。
-
这些缺点使得匿名方法在某些情况下可能不是最佳选择,特别是在需要高可读性和可重用性的项目中。
-
本质
-
C#匿名方法的本质是委托
-
-
-
lambda表达式
-
C# Lambda表达式定义
Lambda 表达式的本质也是匿名方法。Lambda 表达式提供了一种简洁和富有表现力的方式来创建匿名函数,可以使用 => 运算符来构造 Lambda 表达式。
-
定义方式
-
(input-parameters) => { <sequence-of-statements> }
-
参数列表(input-parameters) :
- 可包含零个或多个参数。
- 参数类型可隐式或显式定义
- Lambda运算符:
- 使用
=>
符号分隔参数列表和表达式/语句块。
- 使用
-
表达式/语句块:
- 表达式:单个表达式,计算结果作为Lambda的返回值。
- 语句块:包含在大括号
{}
中的一系列语句,可执行复杂逻辑,最后一个语句的结果作为返回值(若适用)。
-
-
-
使用场景:
- 常用于LINQ查询,提供简洁的数据查询和处理语法。
- 用于事件处理,可以简化事件处理方法的编写。
- 便于创建委托实例,特别是在需要传递简单函数作为参数时。
- C# Lambda样例
- 基本Lambda表达式
- 无参数:
() => Console.WriteLine("Hello, World!");
- 单参数:
x => x * x
- 多参数:
(x, y) => x + y
- 带语句块的Lambda
x => { int result = x * x; return result; }
- 无参数:
- Lambda表达式应用
- LINQ查询:
list.FindAll(x => x > 5);
- 事件处理:
button.Click += (s, e) => { /* 事件处理逻辑 */ };
- LINQ查询:
- 基本Lambda表达式
-
-
Action
- Action的定义
Action 是 C# 中的一个委托类型,表示没有返回值和参数的方法。它用于封装方法,以便可以将其作为参数传递、赋值给其他委托等。
Action其实就是没有返回值的delegate
- 创建方式
- 直接实例化:
- 通过指定方法来创建Action实例。
- 示例:
Action action = MyMethod;
使用匿名方法:- 无需定义独立方法,直接在Action实例化时定义方法体。
- 示例:
Action action = () => { /* 方法体 */ };
- Lambda表达式:
- 简洁方式,适用于简短逻辑或表达式。
- 示例:
Action action = () => Console.WriteLine("Hello, World!");
- 带参数的Action:
- 创建带参数的Action,通过泛型指定参数类型。
- 示例:
Action<int> action = x => Console.WriteLine(x);
- 直接实例化:
原理
委托揭秘 - Old - 博客园 (cnblogs.com)
- Action的定义
委托和匿名方法不能混淆。C#中的委托(Delegate)是一种引用类型,该引用类型与其他引用类型有所不同,在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。
委托是方法的类型安全的引用,之所以说委托是安全的,是因为委托和其他所有的C#成员一样,是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。
匿名方法是C#2.0引入的一个新特性,它允许开发者内联(inline)声明自己的函数代码而无须使用委托函数(delegate)。
当我们需要一个函数,但又懒得去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。