C# 委托及Lambda 表达式

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表达式联合起来,才能充分的体现委托的便利、才能使代码更加简介、优雅。

发布了45 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_32857543/article/details/89404453
今日推荐