匿名方法、Lambda表达式和事件

来源:互联网 发布:sql注入用户名密码 编辑:程序博客网 时间:2024/06/18 11:17

匿名方法

在前面我们知道委托可以指向一个或多个方法,当有一个方法只需要用一次并且很简短,例如:

static int Test1(int arg1,int arg2)        {            return arg1 + arg2;        }//使用委托指向这个方法static void Main(string[] args)        {            Func<int, int, int> f = Test1; //常用的使用委托的方法        }

我们可以对代码进行简化,让其看起来更为简洁,所以我们可以使用匿名方法,直接忽略方法名,因为我们需要用委托指向这个方法,所以这个方法是什么名字对于委托来说不重要。我们在创建委托变量的时候就可以直接创建匿名方法,并且不需要返回值:

static void Main(string[] args)        {            //使用匿名方法 本质上是一个没有名字的方法,只要能使用委托变量的地方就能使用匿名方法            Func<int, int, int> f = delegate(int arg1, int arg2)            {                return arg1 + arg2;            };        }

这样我们就不需要再额外定义一个方法,直接使用委托变量指向这个方法,因为编译器会根据return后面的值来判断返回值,所以我们也不需要写返回值。
需要注意的是,我们需要使用delegate关键字定义这个方法。


Lambda表达式

Lambda表达式其实也是匿名方式,只是换了一种表现形式。在匿名方式的例子里我们可以看得出,匿名方式将原来的代码简化成4行,但是其实我们可以使用Lambda表达式将代码再次简化。

Func<int, int, int> f = (arg1, arg2) => { return arg1 + arg2; };

这样我们直接将代码简化成一行,因为在Func委托里,已经写了参数的类型,所以我们后面不需要再重新定义数据的类型。在Lambda表达式中,我们只需要写参数以及方法体就可以了。

当参数只有一个的时候,大括号和return都可以省去

Func<int, int> a = b => b + 1;

这个语句的意思是创建了一个名字为a的委托变量,指向了一个只有b参数的方法,方法体为返回一个b+1的值。

关于Lambda表达式外部的变量
我们通过Lambda表达式也可以访问方法外部的变量,但是这个功能使用的时候需要谨慎,因为如果访问了外部的变量,那么这个表达式就不仅仅受传入的参数的控制了,结果可能还会因外部的变量的改变而改变。
例如:

//访问外部变量            int val = 15;            Func<int, int> c = plus => plus + val;            Console.WriteLine(c(10));            val = 20;            Console.WriteLine(c(10));

这段代码中,输出的结果是不一样的,因为Lambda表达式中访问了外部val这个变量,当val的值改变,这个表达式所返回的值也随之改变。


事件

我们可以认为事件是一种具有特殊签名的委托,它基于委托,为委托提供了一个发布/订阅机制。
事件的声明

public event 委托类型 事件名;public delegate void MyDelegate();

事件使用event关键字来声明,它的返回类型是一个委托类型,通常来说,事件的命名是以名字+Event作为它的名称,在写代码过程中,我们需要尽量使用规范命名,增加代码可读性。
在下一篇文章中会写一个例子,来弄清楚委托和事件的区别。

原创粉丝点击