代码改变世界

匿名类型与Lambda表达式

2013-01-02 19:57  哒不溜  阅读(1553)  评论(0编辑  收藏  举报

匿名类型

先上一个匿名类的例子吧:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo2
{
    class Program
    {
        static void Main(string[] args)
        {
            string mid = ",middle part";

            //匿名方法的应用,在3.0以后就是用lambda表达式来代替了匿名方法
            Func<string, string> anonDel = delegate(string param)
            {
                param += mid;
                param += "and this was added to the string.";
                return param;
            };
            Console.WriteLine(anonDel("Start of string"));
            Console.ReadKey();
        }
    }
}

例子很简单,简单到大家一看就懂,但是我想提醒两点大家需要注意的地方:
1:在匿名方法中不能使用跳转语句(break、goto或则continue)跳转到该匿名方法的外部,反之亦然:匿名方法外部的跳转语句不能跳到该匿名方法的内部。

2:在匿名方法内部不能访问不安全的代码。另外,也不能访问在匿名方法外部使用的ref和out参数。但是可以使用在匿名发方法外部定义的其他变量。

 

Lambda表达式

在上面的代码中也说过可以用Lambda表达式替换到匿名类型,那么上面的代码用lambda表达式表示如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateDemo3
{
    class Program
    {
        static void Main(string[] args)
        {
            string mid = ",middle part";
            //Lambda表达式
            Func<string, string> lambda = param =>
                {
                    param += mid;
                    param += "and this was added to the string.";
                    return param;
                };
            Console.WriteLine(lambda("Start of string"));
            Console.ReadKey();
        }
    }
}

Lambda表达式的语法比匿名方法更简单。
Lambda运算符“=>”的左边是参数,右边是方法体(方法的实现代码)。