Delegate 委托
委托声明:public delegate int MyDelegate (string s);
用delegate关键字定义委托,它是对特定返回类型和参数的方法的抽象,是你定义的一种新数据类型,它与int、class是一样的都是数据类型。符合类型的方法均可为其赋值。方法是一种实现特定功能的操作行为,可以简单地看做,具有特定返回类型和参数的代码块。特定的返回类型和参数即对应一种特定的委托类型。
注意:定义一个委托相当于定义一个新类,所有可以定义类的地方都可以定义委托。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,同时使得程序具有更好的可扩展性。
把方法赋值给委托,调用委托就相当于调用方法,委托与方法等效,因此也可以将方法定义直接赋值给委托。
delegate void NumberChanger(int n);
NumberChanger nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
}; //方法定义赋值委托
//上述写法等价于
Action<int> nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
匿名方法:
因为没有方法名称,所以称为匿名方法——最常见的用法是实例化委托,即给委托变量赋值,或者说给委托分配方法。
匿名函数可以用来初始化委托,可在需要委托类型的任何地方使用。
多播委托:一个委托分配多个方法,一次执行多个方法
预定义委托:——泛型委托
Action 无返回值委托 Action a = Test; Action<string> a = PrintStr;
Func 有返回值委托 Func<int> b = Test1; Func<string, int> a = Test2;
———————————————————————————————————————————————————————
Lambda 表达式
Lambda 表达式是一个匿名函数,由匿名函数简化而来,它可以包含表达式和语句,并且可用于实例化委托。
Lambda表达式基于数学中的λ演算得名,C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。
语法格式:(参数列表)=>表达式或语句块
合法的Lambda表达式:
1、(x, y) => x * y //多参数,隐式类型=> 表达式
2、x => x * 5 //单参数, 隐式类型=>表达式
3、x => { return x * 5; } //单参数,隐式类型=>语句块
4、(int x) => x * 5 //单参数,显式类型=>表达式
5、(int x) => { return x * 5; } //单参数,显式类型=>语句块
6、() => Console.WriteLine() //无参数
在编写Lambda表达式时,可以忽略参数的类型,因为编译器能够根据上下文直接推断参数的类型。
Lambda 表达式使用 lambda 声明运算符 => 从其可执行代码中分离 lambda 参数列表。 Lambda 表达式,需要在 lambda 运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。
方法——>匿名方法——>lambda表达式 更加简洁
委托和Lambda表达式联合起来,才能充分的体现委托的便利、才能使代码更加简介、优雅。