Basic_grammer_Delegate

2018-04-30 10:04:45

  • 委托
  • 委托 与 策略模式, 组合模式 , 匿名函数,闭包。
  • 委托和事件

 

委托 delegate

  • 是一种类型 Type.
  • 其声明 由 关键字 delegate + 返回类型 + 委托名 +(参数列表) 组成。
  • 用于在运行时确定使用的方法列表。可以是实例方法,也可以是静态方法。
  • 委托里的方法列表,会对从初始传入的参数均执行一遍,该值按顺序改变。如果有返回值则是最后一个方法的返回。

组合委托  两个委托   MyDel delC = delA + delB  ,最终会创建一个新的委托,原始的 A 和 B 不改变,创建了新的副本赋值。

用法:

  • 委托的返回类型,参数类型,数量 要与方法一致。

匿名方法

不需要命名,减少了命名冲突。

匿名方法关键词 : 外部变量,在方法作用域之外的变量; capture 方法捕获。

 

lambda 表达式  替代了匿名方法

 

注意 如果委托有 ref  和 out 修饰符的时候, 不能省略 类型修饰符。

无参数时,不能省略括号。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace DelegateDemo
 8 {
 9     delegate int Mydel(int val); // declare a delegate type
10     class DelegateDemo
11     {
12         int DemoM(int x)
13         {
14             return x + 1;
15         }
16 
17         public static int S_DemoM(int x)
18         {
19             return x + 3;
20         }
21 
22         static void Main()
23         {
24             DelegateDemo dd = new DelegateDemo();
25 
26             Mydel del1 = new Mydel(dd.DemoM);
27 
28             del1 += S_DemoM; // 给委托添加方法
29             del1 -= S_DemoM; // 注意 删除的时候从方法列表的最后面开始匹配。
30 
31             Mydel del2 = dd.DemoM;  // Compiler inferred [int] type parameters;
32 
33             Mydel del3 = del1 + del2; // 组合委托 Componet delegate
34 
35             Mydel del4 = (int x) => { return x + 3; };
36 
37             // 委托有 ref,out 参数,必须注明类型。
38 
39             Mydel del5 = x => x + 3; // 类型推断。type inference
40 
41             // 空委托会异常,和null比较来判断委托的调用列表是否为空。
42             if (del5 != null)
43                 del5(3);
44 
45         }
46     }
47 }

 

posted @ 2018-04-30 13:00  君子之行  阅读(130)  评论(0)    收藏  举报