在Main方法添加对委托链的调用:
static void Main(string[] args)
{
Program p = new Program();
StaticDelegateDemo();
InstanceDelegateDemo();
ChainDelegateDemo(p);
ChainDelegateDemo2(p);
Console.WriteLine("Hello World!");
Console.ReadKey();
}
启动项目:

7. C#为委托提供的简化:
7.1 不需要构造委托对象:
之前的代码:
Counter(1, 10, new Feedback(FeedbackToConsole));
构造了一个委托对象并传递给Counter方法,由于C#编译器能自己推断。所以可以省略构造委托对象,直接传递方法。使代码的可读性更佳,也更容易理解。
简化后的代码:
/// <summary>
/// 静态调用
/// </summary>
private static void StaticDelegateDemo()
{
Console.WriteLine("---------委托调用静态方法------------");
Counter(1, 10, null);
//Counter(1, 10, new Feedback(FeedbackToConsole));
Counter(1, 10, FeedbackToConsole);
}
可以看到效果是一样的:

7.2 简化语法:不需要定义回调方法(以lambda表达式实现)
在前面的代码中定义了一个回调方法:
/// <summary>
/// 静态回调方法
/// </summary>
/// <param name="value"></param>
private static void FeedbackToConsole(int value)
{
// 依次打印数字
Console.WriteLine("Item=" + value);
}
现在以lambda表达式方式实现:
/// <summary>
/// 静态调用
/// </summary>
private static void StaticDelegateDemo()
{
Console.WriteLine("---------委托调用静态方法------------");
Counter(1, 10, null);
//Counter(1, 10, new Feedback(FeedbackToConsole));
//Counter(1, 10, FeedbackToConsole);
Counter(1, 10, value => Console.WriteLine(value));
}
lambda表达式实际上是一个匿名函数。编译器在看到lambda之后会在类中自动定义一个新的私有方法。类似于之前写的回调方法FeedbackToConsole()lambda必须匹配委托!
lambda的语法: 参数 => 方法体。
=>左边是要传入的参数,本例中是传入一个Int类型的变量,=>右边是具体的代码,相当于FeedbackToConsole(),{}中所做的操作
一些规则:
如果不传递参数: ()=>Console.WriteLine("Hello World!")
传递一个参数:(int n)=>Console.WriteLine(n.ToString()) 或者去掉()和int 编译器会自己推断类型:n=>Console.WriteLine(n.ToString())
传递多个参数:(int n ,int m)=>Console.WriteLine(n.ToString())










