匿名函数

  class Program
    {
        // 定义投票委托
        delegate void VoteDelegate(string name);

        static void Main(string[] args)
        {
            // 实例化委托对象
            VoteDelegate votedelegate = new VoteDelegate(new Friend().Vote);

            // 使用匿名方法的代码
            // 匿名方法内联了一个委托实例(可以对照上面的委托实例化的代码来理解)
            // 使用匿名方法后,我们就不需要定义一个Friend类以及单独定义一个投票方法
            // 这样就可以减少代码量,代码少了,阅读起来就容易多了,以至于不会让过多的回调方法的定义而弄糊涂了
            //VoteDelegate votedelegate = delegate(string nickname)
            //{
            //    Console.WriteLine("昵称为:{0} 来帮Learning Hard投票了", nickname);
            //};

            // 通过调用托来回调Vote()方法
            votedelegate("SomeBody");
            Console.Read();
        }
    }

    public class Friend
    {
        // 朋友的投票方法
        public void Vote(string nickname)
        {
            Console.WriteLine("昵称为:{0} 来帮Learning Hard投票了", nickname);
        }
    }

看一下无注释的

class Program
{
delegate void toupiao(string name);

static void Main(string[] args)
{

toupiao t = new Person().Fun;
t += new Person().Fun1;

//toupiao t = delegate (string name)
// {
// Console.WriteLine(name + "啊票");
// };

// t += delegate (string name)
// {
// Console.WriteLine(name + "弃票");
// };


t("hehehe");
}
}

class Person
{
public void Fun(string name)
{
Console.WriteLine(name + "投票");
}

public void Fun1(string name)
{
Console.WriteLine(name + "弃票");
}
}

 

匿名函数还可以不传参数注册

toupiao t = delegate
{
Console.WriteLine("啊票");
};

t += delegate
{
Console.WriteLine( "弃票");
};

 

lambda表达式表示更简便,不过lambda不允许无参数注册

 

toupiao t = (x) => { Console.WriteLine(x + "投票"); };
t += (x) => { Console.WriteLine(x + "弃票"); };

 

 

Lambda表达式和匿名方法表达式的区别:

  1. 当没有参数的时候,匿名方法表达式允许完全省略参数列表,从而可以转换为具有任意值参数列表的委托类型,Lambda表达式则不能省略参数列表的圆括号()。

  2. Lambda表达式允许省略和推断类型参数,而匿名方法表达式要求显式声明参数类型。

  3. Lambda表达式主体可以为表达式或者代码块,而匿名方法表达式的主体必须为代码块。

  4. 只有Lambda表达式可以兼容到表达式树类型。

posted @ 2018-07-03 15:20  吃豆人  阅读(103)  评论(0编辑  收藏  举报