匿名方法

先前的章节中提过,委托是用于引用与其具有相同签名的方法,即使用委托对象,就可以调用任何被该委托引用的方法。

匿名方法提供了一种将一段代码块作为委托参数的技术。顾名思义,匿名方法没有名字,只有方法主体。

你不需要为匿名方法指定返回类型,其返回类型直接由方法主体推断而来。

编写匿名方法

匿名方法通过使用 delegate 关键字创建委托实例来实现方法的声明,如:

  1. delegate void NumberChanger(int n);
  2. ...
  3. NumberChanger nc = delegate(int x)
  4. {
  5. Console.WriteLine("Anonymous Method: {0}", x);
  6. };

上述代码块中的 Console.WriteLine(“Anonymous Method: {0}”, x); 就是匿名方法的主体。

委托可以通过匿名方法调用,也可以通过命名方法调用,即,通过向委托对象来传递方法参数,如:

  1. nc(10);

示例

  1. using System;
  2. delegate void NumberChanger(int n);
  3. namespace DelegateAppl
  4. {
  5. class TestDelegate
  6. {
  7. static int num = 10;
  8. public static void AddNum(int p)
  9. {
  10. num += p;
  11. Console.WriteLine("Named Method: {0}", num);
  12. }
  13. public static void MultNum(int q)
  14. {
  15. num *= q;
  16. Console.WriteLine("Named Method: {0}", num);
  17. }
  18. public static int getNum()
  19. {
  20. return num;
  21. }
  22. static void Main(string[] args)
  23. {
  24. //使用匿名方法创建委托实例
  25. NumberChanger nc = delegate(int x)
  26. {
  27. Console.WriteLine("Anonymous Method: {0}", x);
  28. };
  29. //使用匿名方法调用委托
  30. nc(10);
  31. //使用命名方法实例化委托
  32. nc = new NumberChanger(AddNum);
  33. //使用命名方法调用委托
  34. nc(5);
  35. //使用另一个命名方法实例化委托
  36. nc = new NumberChanger(MultNum);
  37. //使用另一个命名方法调用委托
  38. nc(2);
  39. Console.ReadKey();
  40. }
  41. }
  42. }

编译执行上述代码,得到如下结果:

  1. Anonymous Method: 10
  2. Named Method: 15
  3. Named Method: 30