文章目录
- 匿名方法
- Lambda表达式
- 实例
- 实例
|
C#中的匿名方法是在C#2.0引入的,它终结了声明委托的唯一方法是使用命名方法的时代。在C#更高版本中,Lambda表达式取代了匿名方法,作为编写内联代码的首选方式。但是,匿名方法的信息同样也适用Lambda表达式,可以说Lambda表达式就是匿名方法演变过来的。匿名方法可以用来忽略参数列表,可以转化为具有各种签名的委托,而这对于Lambda表达式来说是不可能的。
匿名方法
要将代码块传递为委托参数,创建匿名方法则是唯一的方法。匿名方法就是为了将代码块传递为委托参数,因此也有人将其称为匿名委托。使用C#匿名方法可以使委托及事件的代码编写更加精简、高效。一般情况下,事件注册事件处理方法,需要首先定义这个方法,如果该方法仅用于订阅特定的事件,则可使用代码更加简明的匿名方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace test
{class Program{static void Main(string[] args){Heater heater = new Heater();heater.BoilEvent += delegate(int param){Console.WriteLine("Alarm:dididid,水已经{0}℃了", param);};heater.BoilEvent += delegate(int param){Console.WriteLine("Display:水快开了,当前温度为:{0}℃", param);};heater.BoilWater();Console.ReadKey();}}public class Heater{private int temperature;//水温public delegate void BoilHandle(int x);//声明关于事件的委托public event BoilHandle BoilEvent;//声明水要烧开的事件public void BoilWater(){ //烧水的方法for (int i = 0; i <= 100; i++){temperature = i;if (temperature > 96){if (BoilEvent != null){BoilEvent(temperature);}}}}}}
运行结果
Lambda表达式
Lambda表达式是一种可用于创建委托或表达式目录树类型的匿名函数。通过使用lambda表达式,可以写入可作为参数传递或作为参数传递或作为函数调用值返回的本地函数。Lambda表达式对于编写LINQ查询表达式特别有用。若要创建Lambda表达式,需要在Lambda运算符=>
左侧指定输入参数,然后在另一侧输入表达式或语句块。
实例
lambda表达式x=>x*x
指定名为x
的参数并返回x
的平方值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;namespace test
{class Program{static void Main(string[] args){Expression<del> myET = x => x * x;Console.ReadKey();}}
}
委托签名具有一个int
类型的隐式类型输入参数,并返回int
。可以将lambda表达式转换为该类型的委托,因为该表达式也具有一个输入参数(x
),以及一个编译器可隐式转换为int
型的返回值。
表达式位于=>
运算符右侧的lambda表达式称为lambda表达式
。表达式lambda广泛用于C#的表达式树的构造。表达式lambda会返回表达式的结果。
实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;namespace test
{class Program{public delegate bool ShortDelegate(int[] x);static void Main(string[] args){int[] arr = new int[] { 8, 4, 5, 6, 2, 1, 3, 7, 9, 0 };Console.WriteLine("未排序前数组序列为:");foreach (int i in arr){Console.Write("{0},", i);}ShortDelegate MyDelegate = array => {for (int i = array.GetUpperBound(0); i >= 0; i--)//循环从后向前分别取出数组中的一个元素{//冒泡排序,将数值小的元素移到后面,直到所有的元素按照降序排列for (int j = 0; j <= i; j++){if (array[j] <= array[i]){//交换两个元素位置int z = array[j];array[j] = array[i];array[i] = z;}}}return true;};MyDelegate(arr);//调用委托排序Console.WriteLine("\n排序后数组序列为:");foreach (int i in arr){Console.Write("{0},", i);}Console.ReadKey();}}}
运行结果:
------------------------------------------------------------------------------------------分割线
------------------------------------------------------------------------------------------
|
|