第十七章 委托

2013-02-27

回调函数
17.1 初识委托
17.2 协变性和逆变性
17.4 委托揭秘
17.5 用委托回调许多方法(委托链
17.6 委托定义太多(泛型委托
17.7 C#为委托提供简单语法
  17.7.1 简化语法1:不需要构造委托对象
  17.7.2 简化语法2:不需要回调方法
参考

ToDo: 写一个委托简单实例 

回调函数是一种非常有用的机制。

回调函数【1 :回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

回调函数实现的机制1:

(1)       定义一个回调函数;

(2)       提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

(3)       当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

为什么要使用回调函数

因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。

17.1 初识委托


返回 

在Microsft Window中,窗口过程、钩子过程和异步调用过程等都需要回调函数。在.Net Framework中,回调方法更是广泛。委托是.Net Framework提供的一种类型安全的回调函数机制。

17.2 协变性和逆变性

1    delegate object MyCallback(FileStream s);
2    string SomeMethod(Stream s);

将一个方法绑定到委托时,C#和CLR都允许引用类型的协变性(covariance)和逆变性(contravariance)。

协变性:指方法能返回从委托的返回类型派生的一个类型。

逆变性:值方法获取的参数可以是委托参数的基类。

注意:协变性与逆变性只能用于引用类型,不能用于值类型或void。

协变性与逆变性扩展:[翻译]协变性与逆变性FAQ

17.4 委托揭秘


返回

 从表面看委托使用起来很方便:

(1)       创建一个与方法具有相同特征(返回值,方法名,方法签名)的委托类型

(2)       用new创建一个委托实例

(3)       把委托实例看成相应方法,调用之

 1 using System;
 2 namespace SimpleDelegate
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             Grade m = new Grade();
 9             //(2)用new创建一个委托实例
10             Feedback f1 = new Feedback(m.Pass);
11             Feedback f2 = new Feedback(Grade.sPass);
12 
13             //(3)把委托实例看成相应方法,调用之
14             f1(60);
15             f2(60);
16             Console.Read();
17         }
18     }
19 
20     //(1)创建一个与方法具有相同特征(返回值,方法名,方法签名)的委托类型
21     internal delegate void Feedback(int i);
22 
23     class Grade
24     {
25         //(1)创建一个与方法具有相同特征(返回值,方法名,方法签名)的委托类型
26         public void Pass(int i)
27         {
28             if (i >= 60) Console.WriteLine("Pass");
29             else Console.WriteLine("Failed");
30         }
31 
32         public static void sPass(int i)
33         {
34             if (i >= 60) Console.WriteLine("Pass");
35             else Console.WriteLine("Failed");
36         }
37     }
38 }
View Code

相关文章: