C# 委托之匿名方法和lambda表达式

在前面两篇文章C# 委托的基本概念C# Action和Func委托中,要使用委托,必须提前把方法写好,但还有新的使用委托的方式,那就是匿名方法。


一、匿名方法

使用匿名方法时,在实例化委托的时候将会有所不同:

 class Program
    {
        static void Main()
        {
            string mid = ", middle part,";

            Func<string, string> anonDel = delegate (string param)
            {
                param += mid;
                param += " and this was added to the string.";
                return param;
            };
            WriteLine(anonDel("Start of string"));

        }
    }

Func<string, string>委托接受一个字符串参数,返回一个字符串,anonDel就是这个委托变量,实例化的时候,不是把方法名赋予这个变量,而是使用一段代码。

这段代码前面是关键字delegate,后面是一个字符串参数。匿名方法的使用可以使代码更加简洁。当然,如果一个匿名方法需要使用多次,就不要使用匿名方法,编写一个命名方法更好。

但在实践中,我们一般也不使用匿名方法,而是使用lambda表达式。

二、Lambda表达式

从C#3.0之后,可以使用一种新的语法把实现的代码赋予委托,那就是lambda表达式,上面的例子我们就可以修改为lambda表达式:

 class Program
    {
        static void Main()
        {
            string mid = ", middle part,";

            Func<string, string> anonDel = param=>
            {
                param += mid;
                param += " and this was added to the string.";
                return param;
            };
            WriteLine(anonDel("Start of string"));

        }
    }

lambda运算符"=>"的左边是输入参数,右边是实现的代码。

2.1 定义参数

如果只有一个参数,只写出参数名即可:

Func<string,string> oneParam=s=>$"change uppercase{s.ToUpper()}";
WriteLine(oneParam("test"));

上面的lambda表达式使用了参数s,因为委托类型定义了一个string参数,所以s类型就是string.

如果有多个参数,就把用圆括号将参数名括起来:

Func<double, double,double> twoParams=(x,y)=>x*y;
WriteLine(twoParms(3,2));

上面的lambda表达式,参数x和y的类型是double,由Func<double, double, double>委托定义。

为了方便,可以在圆括号中给变量名添加参数类型:

Func<double, double,double> twoParams=(double x,double y)=>x*y;
WriteLine(twoParms(3,2));

2.2 简写

如果lambda表达式只有一条语句,在方法块内就不需要花括号和return语句,因为编译器会添加一条隐式的return语句:

Func<double, double> square=x=>x*x;

如果有多行代码,就必须添加花括号和return语句:

            Func<string, string> anonDel = param=>
            {
                param += mid;
                param += " and this was added to the string.";
                return param;
            };
 

注:lambda表达式可以用于类型为委托的任意地方,类型是Expression或Expression<T>时,也可以使用lambda表达式,此时编译器会创建一个表达式树,这个在以后的文章中会提及。


参考:C#高级编程第十版(作者Christian Nagel)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值