#region 无返回值委托调用
public static void Show()
{
//实例化委托
NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = new NoParaNoReturnEventHandler(ConsoleInfo);
//NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = ConsoleInfo; //简写
//委托调用 通过Invoke()调用,或者可以直接省略
_NoParaNoReturnEventHandler.Invoke();
//_NoParaNoReturnEventHandler();
}
private static void ConsoleInfo()
{
Console.WriteLine("无参数无返回值的函数调用");
}
#endregion

没有委托就没有异步,异步正是因为委托的存在。
_NoParaNoReturnEventHandler.BeginInvoke(null,null); //异步调用
为什么要使用委托
我们完全可以直接调用方法,为什么还需要通过一个委托来调用呢?委托有什么意义?
解耦,对修改关闭,对扩展开放。逻辑分离。
你可以把委托理解为函数的父类,或者是一个方法的占位符。
我们来看下代码,假设有2个方法,一个说英语,一个说汉语,而这2个方法的函数签名是一样的。
public static void SayChinese(string name)
{
Console.WriteLine("你好," + name);
}
public static void SayEnglish(string name)
{
Console.WriteLine("hello," + name);
}
那么我们在外部调用的时候,
MyDelegate.SayChinese("张三");
MyDelegate.SayEnglish("zhangsan");
如果要调用这两个不同的方法,是不是要写不同的调用代码
我们能不能只一个方法调用呢?修改代码如下:
public static void Say(string name,WithParaNoReturnEventHandler handler)
{
handler(name);
}
public static void SayChinese(string name)
{
Console.WriteLine("你好," + name);
}
public static void SayEnglish(string name)
{
Console.WriteLine("hello," + name);
}
这样,只通过一个方法Say来进行调用。
如何调用呢?如下三种调用方式:
WithParaNoReturnEventHandler _WithParaNoReturnEventHandler = new WithParaNoReturnEventHandler(MyDelegate.SayChinese);
MyDelegate.Say("张三",_WithParaNoReturnEventHandler);
MyDelegate.Say("张三", delegate(string name) { Console.WriteLine("你好," + name); }); //匿名方法
MyDelegate.Say("张三", (name) => { Console.WriteLine("你好," + name); }); //lambda表达式
以上代码使用了几种调用方式,这些调用方式都是随着C#的升级而不断优化的。第一种是C#1.0中就存在的传统调用方式,第二种是C#2.0中的匿名方法调用方式,所谓匿名方法,就是没有名字的方法,当方法只调用一次时使用匿名方法最合适不过了。C#3中的lambda表达式。其实泛型委托同样是被支持的,而.NET 3.5则更进一步,引入了一组名为Func的泛型委托类型,它能获取多个指定类型的参数,并返回另一个指定类型的值。










