详解C#之委托

2020-06-04 16:01:00于海丽

在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())