委托

一、初识委托
    1、C#中委托是一种特殊的引用类型,委托相当于方法的一个指针,委托和类是同一级别的
    2、语法:
        访问修饰符 delegate 返回类型 名称(参数列表);
        
        eg:
          

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication1
 8 {
 9     public delegate double multiOp(double x);
10     class Program
11     {
12         //方法1  求平方
13         static double Multiply(double x)
14         {
15             return x * x;
16         }
17         //方法2 求开方
18         static double Sqrt(double x)
19         {
20             return Math.Sqrt(x);
21         }
22 
23         //方法3 委托作为方法的参数
24         static double Operation(double x, multiOp ops)
25         {
26             return ops(x);
27         }
28 
29         static void Main(string[] args)
30         {
31             //实例化了一个委托对象
32                 //实例化委托并调用
33                 multiOp compute = new multiOp(Multiply);
34                 Console.WriteLine("{0}的平方为{1}",4,compute(4));
35 
36                 //实例化委托并调用
37                 compute = new multiOp(Sqrt);
38                 Console.WriteLine("{0}的开方为{1}", 16, compute(16));
39 
40             //不实例化委托
41                 multiOp compute2 = Multiply;
42                 Console.WriteLine("{0}的平方为{1}", 4, compute2(4));
43 
44                 compute2 = Sqrt;
45                 Console.WriteLine("{0}的开方为{1}", 16, compute2(16));
46 
47             //委托作为方法的参数
48                 Console.WriteLine("委托作为方法的参数:" + Operation(2, Multiply)); 
49 
50             Console.ReadLine();
51         }
52     }
53 }


            
二、匿名方法
    1、匿名方法这种语法机制主要是为了简化委托对象的使用
    2、语法:    
        delegate(参数列表){表达式或语句块}
        
        eg:
          

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication2
 8 {
 9     public delegate double multiOp(double x);
10     class Program2
11     {
12         //方法 委托作为方法的参数
13         static double Operation(double x, multiOp ops)
14         {
15             return ops(x);
16         }
17 
18         static void Main(string[] args)
19         {
20             multiOp mp = delegate(double x)
21             {
22                 return x * x;
23             };
24 
25             //1.将方法参数作为参数
26             Console.WriteLine("委托作为方法的参数:" + Operation(2, mp));
27             //2.将方法参数作为参数
28             Console.WriteLine("委托作为方法的参数:" + Operation(2, delegate(double x) { return x * x; }));
29 
30             Console.ReadLine();
31             
32         }
33     }
34 }



三、Lamda表达式
    1、在C#3.0提供了Lamda表达式,进一步简化了委托的使用
    2、语法:    
        (参数列表)=>表达式或语句块
        
        (x) =>{return x*x}
        (x) =>{return r=x*x;return r;}
        
        参数列表:可以是多个参数,一个参数,或者无参数;必须和委托参数一致
        =>:运算符,表明什么参数传递给表达式
        表达式或语句块:方法的实现部分(方法体)
        
        eg:
          

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication3
 8 {
 9     public delegate double multiOp(double x);
10     class Program3
11     {
12         //方法 委托作为方法的参数
13         static double Operation(double x, multiOp ops)
14         {
15             return ops(x);
16         }
17 
18         static void Main(string[] args)
19         {
20             //1.将方法参数作为参数
21             Console.WriteLine("委托作为方法的参数:" + Operation(2, (x) => x * x));
22 
23             Console.ReadLine();
24         }
25     }
26 }


            
四、泛型委托
    1、在.NET中,提供了一些默认的委托形式
        public delegate TResult Func<in T,out TResult>(T arg);            //最后一个是输出类型其他都是输入类型
                                Action<in T,in T1>(T arg);                //全是输入类型
                                Predicate<in T>(T arg);
        eg:
          

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication4
 8 {
 9     class Program4
10     {
11         static void Main(string[] args)
12         {
13             Func<double, double> ope = x => x * x;
14             Func<int, bool> del = a => a > 10;
15             
16 
17             Console.WriteLine(ope(10));
18             Console.WriteLine(del(12));
19         }
20     }
21 }
原文地址:https://www.cnblogs.com/JamelAr/p/7123036.html