下面这篇代码展示了委托的运用,非常精彩,代码版权归"@microsoft"所有.
1//版权所有 (C) 2000 Microsoft Corporation。保留所有权利。
2
3// bookstore.cs
4using System;
5
6// 处理书店的一组类:
7namespace 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// 正在使用书店类:
57namespace 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// bookstore.cs
4using System;
5
6// 处理书店的一组类:
7namespace 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// 正在使用书店类:
57namespace 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
Paperback Book Titles:
The C Programming Language
The Unicode Standard 2.0
Dogbert's Clues for the Clueless
Average Paperback Book Price: $23.97