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

匿名方法

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

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作为它的名称,在写代码过程中,我们需要尽量使用规范命名,增加代码可读性。
在下一篇文章中会写一个例子,来弄清楚委托和事件的区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值