匿名函数
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表达式和匿名方法表达式的区别:
-
当没有参数的时候,匿名方法表达式允许完全省略参数列表,从而可以转换为具有任意值参数列表的委托类型,Lambda表达式则不能省略参数列表的圆括号()。
-
Lambda表达式允许省略和推断类型参数,而匿名方法表达式要求显式声明参数类型。
-
Lambda表达式主体可以为表达式或者代码块,而匿名方法表达式的主体必须为代码块。
-
只有Lambda表达式可以兼容到表达式树类型。

浙公网安备 33010602011771号