您的位置:首页 > 编程语言 > C#

委托(2)

2016-08-10 17:29 162 查看

匿名委托

当方法需要委托类型参数时,我们就传递类型与之对应的方法A过去,如果方法A在项目中仅使用了一次,那为了传参单独建一个方法就有点浪费了,这时我们可以使用匿名方法。

//DelegateHelper.cs文件代码
public delegate string SayHiEventHandler(string name);
public class DelegateHelper
{
public void SayHi(string name,SayHiEventHandler sayHi)
{
sayHi(name);
}

public string SayHiByEnglish(string name)
{
Console.WriteLine("Hello:" + name);
return "success";
}

public string SayHiByChinese(string name)
{
Console.WriteLine("你好:" + name);
return "成功";
}
}
//Program.cs文件代码
class Program
{
static void Main(string[] args)
{
//传递已有方法
new DelegateHelper().SayHi("蝈蝈",new DelegateHelper().SayHiByChinese);
new DelegateHelper().SayHi("guoguo", new DelegateHelper().SayHiByEnglish);
//传递匿名方法
new DelegateHelper().SayHi("蝈蝈", delegate(string name) {
Console.WriteLine("匿名方法,name=" + name); return "匿名方法";
});
Console.ReadKey();
}
}


运行结果如下:



Lambda表达式来源

匿名方法进一步简化就可以得到Lambda表达式,下面演示简化过程:

static void Main(string[] args)
{
//匿名方法
new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler(delegate(string name) { Console.WriteLine(name); return name + "aaa"; }));
//去掉delegate,增加=>
new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler((string name) => { Console.WriteLine(name); return name + "aaa"; }));
//去掉参数类型
new DelegateHelper().SayHi("蝈蝈", new SayHiEventHandler((name) => { Console.WriteLine(name); return name + "aaa"; }));
//简化委托,去掉new SayHiEventHandler()
new DelegateHelper().SayHi("蝈蝈", (name) => { Console.WriteLine(name); return name + "aaa"; });
//仅当参数只有一个时,可以省略参数的()
new DelegateHelper().SayHi("蝈蝈", name => { Console.WriteLine(name); return name + "aaa"; });
//仅当委托的方法体只有一句话且没有返回值时可以省略方法体的{}
//这就是我们常见的Lambda表达式
new DelegateHelper().GoodMorning("蝈蝈", name => Console.WriteLine(name + "aaa"));
//当委托的方法体有返回值时不能省略方法体的{}
new DelegateHelper().SayHi("蝈蝈", name => { return name + "aaa"; });
}


Action<>与Func<>

上面说到如果方法只用一次那可以用匿名方法来代替,如果委托只用一次的话也可以被代替,没参数、没返回值的委托用Action代替,有参数没返回值的委托用Action<>代替,有返回值的委托用Func<>代替。

Program.cs文件代码:

class Program
{
static void Main(string[] args)
{
//有返回值
new DelegateHelper().SayHi("蝈蝈",new DelegateHelper().SayHiByChinese);
new DelegateHelper().SayHi("guoguo", new DelegateHelper().SayHiByEnglish);
new DelegateHelper().SayHi("蝈蝈", delegate(string name) {
Console.WriteLine("匿名方法,name=" + name); return "匿名方法返回值";
});
new DelegateHelper().SayHiByFunc("【func】蝈蝈", new DelegateHelper().SayHiByChinese);
new DelegateHelper().SayHiByFunc("【func】guoguo", new DelegateHelper().SayHiByEnglish);
new DelegateHelper().SayHiByFunc("【func】蝈蝈", delegate(string name) {
Console.WriteLine("匿名方法,name=" + name);
return "匿名方法返回值";
});
Console.WriteLine("----------------------------");
//没有返回值
new DelegateHelper().GoodMorning("蝈蝈", new DelegateHelper().GoodMorningByChinese);
new DelegateHelper().GoodMorning("guoguo", new DelegateHelper().GoodMorningByEnglish);
new DelegateHelper().GoodMorning("蝈蝈", delegate(string name)
{
Console.WriteLine("匿名方法,name=" + name);
});
new DelegateHelper().GoodMorningByAction("【action】蝈蝈", new DelegateHelper().GoodMorningByChinese);
new DelegateHelper().GoodMorningByAction("【action】guoguo", new DelegateHelper().GoodMorningByEnglish);
new DelegateHelper().GoodMorningByAction("【action】蝈蝈", delegate(string name)
{
Console.WriteLine("匿名方法,name=" + name);
});

Console.ReadKey();
}
}


DelegateHelper.cs文件代码:

public delegate string SayHiEventHandler(string name);
public delegate void GoodMorningEventHandler(string name);
public class DelegateHelper
{
public void SayHi(string name,SayHiEventHandler sayHi)
{
sayHi(name);
}
//Func<string,string> func表示包含一个string参数、返回值为string类型的委托
//Func<>最后一个参数表示返回值类型,其他参数均为方法所需参数
//Func<string> func表示无参数、返回值为string类型的委托
public void SayHiByFunc(string name, Func<string, string> func)
{
func(name);
}

public void GoodMorning(string name, GoodMorningEventHandler morning)
{
morning(name);
}
//Action<string> action表示包含一个string参数、无返回值的委托,
//Action action表示无参数、无返回值的委托
public void GoodMorningByAction(string name, Action<string> action)
{
action(name);
}

public string SayHiByEnglish(string name)
{
Console.WriteLine("Hello:" + name);
return "success";
}

public string SayHiByChinese(string name)
{
Console.WriteLine("你好:" + name);
return "成功";
}

public void GoodMorningByEnglish(string name)
{
Console.WriteLine("吃了吗:" + name);
}

public void GoodMorningByChinese(string name)
{
Console.WriteLine("Good Weather:" + name);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息