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表达式可以兼容到表达式树类型。