委托是回调函数的类型安全包装。C++编写的非托管程序进行回调时很容易出错。由于委托的存在,托管应用程序不会出现这样的情况。委托通常用来定义响应事件的回调方法的签名。
//
bookstore.cs
using System; // 此命名空间中的几个类用以维护书籍数据库: namespace Bookstore ... { using System.Collections; // 描述数据库中每一本书具有的属性: public struct Book ...{ public string Title; // 书的题目. public string Author; // 书的作者. public decimal Price; // 书的价格. public bool Paperback; // 是不是平装书? public Book(string title, string author, decimal price, bool paperBack) ...{ Title = title; Author = author; Price = price; Paperback = paperBack; } } // 为处理平装书的类声明一个委托类型(delegate类型): public delegate void ProcessBookDelegate(Book book); // 维护书籍的数据库. public class BookDB ...{ // 数据库中所有书籍的清单: ArrayList list = new ArrayList(); // 向数据库中添加一本书: public void AddBook(string title, string author, decimal price, bool paperBack) ...{ list.Add(new Book(title, author, price, paperBack)); } // 对于每一本平装书调用ProcessBookDelegate这个委托,以对平装书进行处理: public void ProcessPaperbackBooks(ProcessBookDelegate processBook) ...{ foreach (Book b in list) ...{ if (b.Paperback) // Calling the delegate: processBook(b); } } } } // 使用Bookstore命名空间里的类: namespace BookTestClient ... { using Bookstore; // 具有统计平装书并求出平装书的平均价格功能的类: class PriceTotaller ...{ int countBooks = 0; decimal priceBooks = 0.0m; internal void AddBookToTotal(Book book) ...{ countBooks += 1; priceBooks += book.Price; } internal decimal AveragePrice() ...{ return priceBooks / countBooks; } } // 用以测试书籍数据库的类: class Test ...{ // 打印书籍题目的静态方法. static void PrintTitle(Book b) ...{ Console.WriteLine(" {0}", b.Title); } // 程序执行的入口: static void Main() ...{ BookDB bookDB = new BookDB(); // 用几本书来输初始化书籍数据库: AddBooks(bookDB); // 打印平装书的题目: Console.WriteLine("Paperback Book Titles:"); // 创建与静态方法 Test.PrintTitle 关联的新的委托对象: bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle)); // 通过PriceTotaller的实例获取平装书的平均价格: PriceTotaller totaller = new PriceTotaller(); // 创建与对象 totaller 上的非静态方法 AddBookToTotal 关联的新的委托对象: bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal)); Console.WriteLine("平装书的平均价格: ${0:#.##}", totaller.AveragePrice()); } // 向数据库添加书以初始化书籍数据库: static void AddBooks(BookDB bookDB) ...{ bookDB.AddBook("The C Programming Language", "Brian W. Kernighan and Dennis M. Ritchie", 19.95m, true); bookDB.AddBook("The Unicode Standard 2.0", "The Unicode Consortium", 39.95m, true); bookDB.AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129.95m, false); bookDB.AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12.00m, true); } } } 输出: Paperback Book Titles: The C Programming Language The Unicode Standard 2.0 Dogbert ' s Clues for the |
c#中的委托
最新推荐文章于 2019-02-15 20:29:22 发布