下面这篇代码展示了委托的运用,非常精彩,代码版权归"@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
输出
//版权所有 (C) 2000 Microsoft Corporation。保留所有权利。2

3
// bookstore.cs4
using System;5

6
// 处理书店的一组类:7
namespace Bookstore 8


{9
using System.Collections;10

11
// 描述图书列表中的一本书:12
public struct Book13

{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 BookDB33

{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 BookTestClient58


{59
using Bookstore;60

61
// 计算图书总价格和平均价格的类:62
class PriceTotaller63

{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 Test81

{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

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