《C#本质论》读书笔记(12)委托和Lambda表达式

Posted 【唐】三三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《C#本质论》读书笔记(12)委托和Lambda表达式相关的知识,希望对你有一定的参考价值。


12.1.委托概述

12.1.2 委托的数据类型

为了减少重复代码数量,可以将比较方法作为参数传递给 BubbleSort()方法。此外,为了将方法作为参数传递,必须有一个能够标识方法的数据类型——也就是委托。这里的委托类型是 ComparisonHandler 。
 c# 2.0之前的写法
  1. class DelegateSample  

  2.     {  

  3.         static void Main(string[] args)  

  4.         {  

  5.             //int[] arr = { 10, 20, 30, 40, 50 };  

  6.             int[] arr = { 50, 40, 30, 20, 10 };  

  7.   

  8.             ConsoleArr(arr);  

  9.   

  10.             ComparisonHandler wx = new ComparisonHandler(DelegateSample.IsTrue);  

  11.             BubbleSort(arr, wx);  

  12.       //C#2.0之前是这么写的


  13.       //BubbleSort(arr, new ComparisonHandler(IsTrue));  
  14.   

  15.             ConsoleArr(arr);  

  16.   

  17.             Console.Read();  

  18.         }  

  19.   

  20.         public delegate bool ComparisonHandler(int a, int b);  

  21.   

  22.         public static bool IsTrue(int a, int b)  

  23.         {  

  24.                 return a > b;  

  25.         }  

  26.   

  27.         public static void BubbleSort(int[] items, ComparisonHandler comparisonMethod)  

  28.         {  

  29.             int i;  

  30.             int j;  

  31.             int temp;  

  32.             if (items == null)  

  33.             {  

  34.                 return;  

  35.             }  

  36.             if (comparisonMethod == null)  

  37.             {  

  38.                 throw new ArgumentNullException("comparisonMethod");  

  39.             }  

  40.             for (i = items.Length - 1; i >= 0; i--)  

  41.             {  

  42.                 for (j = 1; j <= i; j++)  

  43.                 {  

  44.                     if (comparisonMethod(items[j - 1], items[j]))  

  45.                     {  

  46.                         temp = items[j - 1];  

  47.                         items[j - 1] = items[j];  

  48.                         items[j] = temp;  

  49.                     }  

  50.                 }  

  51.             }  

  52.         }  

  53.   

  54.         public static void ConsoleArr(int[] arr)  

  55.         {  

  56.             foreach (var item in arr)  

  57.             {  

  58.                 Console.Write(item+",");  

  59.             }  

  60.             Console.WriteLine();  

  61.         }  

  62.     }  



C#2.0以后可以直接调用方法
 
  1. public static bool AlphabeticalIsTrue(int a,int b)  

  2.         {  

  3.             int comparison;  

  4.             comparison = (a.ToString().CompareTo(b.ToString()));  

  5.             return comparison > 0;  

  6.         }  

  7.   

  8.   

  9. //C# 2.0以后直接传递方法  

  10.             BubbleSort(arr, AlphabeticalIsTrue); 


12.1.3 委托内部机制

第一个属性属于 System.Reflection.MethodiInfo 类型,MethodInfo 定义一个特定方法的签名,其中包括方法的名称、参数和返回类型。除了 MethodInfo,委托还需要一个对象实例,其中包含了要调用的方法。这正式第二个属性 Target 的用途。在静态方法的情况下,Target 对应于类型自身。

  1. // 摘要:   

  2. //     初始化一个委托,该委托对指定的类实例调用指定的实例方法。  

  3. //  

  4. // 参数:   

  5. //   target:  

  6. //     类实例,委托对其调用 method。  

  7. //  

  8. //   method:  

  9. //     委托表示的实例方法的名称。  

  10. //  

  11. // 异常:   

  12. //   System.ArgumentNullException:  

  13. //     target 为 null。 - 或 - method 为 null。  

  14. //  

  15. //   System.ArgumentException:  

  16. //     绑定到目标方法时出错。  

  17. [SecuritySafeCritical]  

  18. protected Delegate(object target, string method);  

  19. //  

  20. // 摘要:   

  21. //     初始化一个委托,该委托从指定的类调用指定的静态方法  

  22. //  

  23. // 参数:   

  24. //   target:  

  25. //     System.Type,它表示定义 method 的类。  

  26. //  

  27. //   method:  

  28. //     委托表示的静态方法的名称。  

  29. //  

  30. // 异常:   

  31. //   System.ArgumentNullException:  

  32. //     target 为 null。 - 或 - method 为 null。  

  33. //  

  34. //   System.ArgumentException:  

  35. //     target 不是 RuntimeType。 请参见 反射中的运行时类型。 - 或 - target 表示开放式泛型类型。  

  36. [SecuritySafeCritical]  

  37. protected Delegate(Type target, string method);  



12.2.匿名方法


传递一个匿名方法

  1. class Program 

  2. {  

  3.     public delegate bool ComparisonHandler(int a, int b);  

  4.     static void Main(string[] args)  

  5.     {  

  6.         int i;  

  7.         int[] items = new int[5];  

  8.         ComparisonHandler comparionMethod;  

  9.         for (i = 0; i < items.Length; i++)  

  10.         {  

  11.             Console.WriteLine("Enter an integer:");  

  12.             items[i] = int.Parse(Console.ReadLine());  

  13.         }  

  14.   

  15.        comparionMethod = delegate(int first, int second)   

  16.         {                                                                   

  17.             return first < second;                                    

  18.         };                                                                  

  19.         BubbleSort(items, comparionMethod);                   

  20.   

  21. 《C#高级编程》读书笔记:委托

    C#本质论读书笔记

    读书笔记 C#事件event浅析

    《C#本质论》读书笔记(18)多线程处理

    《C#本质论》读书笔记(16)构建自定义集合

    C#学习之初步理解委托事件匿名方法和Lambda