下面这篇代码展示了委托的运用,非常精彩,代码版权归"@microsoft"所有.
1
//版权所有 (C) 2000 Microsoft Corporation。保留所有权利。
2
3
// bookstore.cs
4
using System;
5
6
// 处理书店的一组类:
7
namespace Bookstore
8

{
9
using System.Collections;
10
11
// 描述图书列表中的一本书:
12
public struct Book
13
{
14
public string Title; // 书的标题。
15
public string Author; // 书的作者。
16
public decimal Price; // 书的价格。
17
public bool Paperback; // 该书是平装本吗?
18
19
public Book(string title, string author, decimal price, bool paperBack)
20
{
21
Title = title;
22
Author = author;
23
Price = price;
24
Paperback = paperBack;
25
}
26
}
27
28
// 声明一个用来处理书的委托类型:
29
public delegate void ProcessBookDelegate(Book book);
30
31
// 维护一个图书数据库。
32
public class BookDB
33
{
34
// 列出数据库中的所有图书:
35
ArrayList list = new ArrayList();
36
37
// 向数据库中添加图书:
38
public void AddBook(string title, string author, decimal price, bool paperBack)
39
{
40
list.Add(new Book(title, author, price, paperBack));
41
}
42
43
// 对每一本平装图书上调用传入的委托来处理该图书:
44
public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
45
{
46
foreach (Book b in list)
47
{
48
if (b.Paperback)
49
// 正在调用委托:
50
processBook(b);
51
}
52
}
53
}
54
}
55
56
// 正在使用书店类:
57
namespace BookTestClient
58

{
59
using Bookstore;
60
61
// 计算图书总价格和平均价格的类:
62
class PriceTotaller
63
{
64
int countBooks = 0;
65
decimal priceBooks = 0.0m;
66
67
internal void AddBookToTotal(Book book)
68
{
69
countBooks += 1;
70
priceBooks += book.Price;
71
}
72
73
internal decimal AveragePrice()
74
{
75
return priceBooks / countBooks;
76
}
77
}
78
79
// 测试图书数据库的类:
80
class Test
81
{
82
// 打印书的标题。
83
static void PrintTitle(Book b)
84
{
85
Console.WriteLine(" {0}", b.Title);
86
}
87
88
// 在此处开始执行。
89
static void Main()
90
{
91
BookDB bookDB = new BookDB();
92
93
// 用一些书初始化数据库:
94
AddBooks(bookDB);
95
96
// 打印平装书的所有书名:
97
Console.WriteLine("Paperback Book Titles:");
98
// 创建与静态方法
99
// Test.PrintTitle 关联的新委托对象:
100
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
101
102
// 获取平装书的平均价格,方法是使用
103
// PriceTotaller 对象:
104
PriceTotaller totaller = new PriceTotaller();
105
// 创建一个与在对象 totaller 上的非静态方法
106
// AddBookToTotal 关联的新委托对象:
107
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
108
Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
109
totaller.AveragePrice());
110
}
111
112
// 用一些测试图书初始化图书数据库:
113
static void AddBooks(BookDB bookDB)
114
{
115
bookDB.AddBook("The C Programming Language",
116
"Brian W. Kernighan and Dennis M. Ritchie", 19.95m, true);
117
bookDB.AddBook("The Unicode Standard 2.0",
118
"The Unicode Consortium", 39.95m, true);
119
bookDB.AddBook("The MS-DOS Encyclopedia",
120
"Ray Duncan", 129.95m, false);
121
bookDB.AddBook("Dogbert's Clues for the Clueless",
122
"Scott Adams", 12.00m, true);
123
}
124
}
125
}
126
输出
2

3

4

5

6

7

8



9

10

11

12

13



14

15

16

17

18

19

20



21

22

23

24

25

26

27

28

29

30

31

32

33



34

35

36

37

38

39



40

41

42

43

44

45



46

47



48

49

50

51

52

53

54

55

56

57

58



59

60

61

62

63



64

65

66

67

68



69

70

71

72

73

74



75

76

77

78

79

80

81



82

83

84



85

86

87

88

89

90



91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114



115

116

117

118

119

120

121

122

123

124

125

126

Paperback Book Titles:
The C Programming Language
The Unicode Standard 2.0
Dogbert's Clues for the Clueless
Average Paperback Book Price: $23.97