首页 > 代码库 > ylbtech-LanguageSamples-Delegates(委托)

ylbtech-LanguageSamples-Delegates(委托)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Delegates(委托)

 

1.A,示例(Sample) 返回顶部

“委托”示例

本示例演示了委托类型。它演示了如何将委托映射到静态方法和实例方法,以及如何组合它们以创建多路广播委托。

安全说明

提供此代码示例是为了阐释一个概念,它并不代表最安全的编码实践,因此不应在应用程序或网站中使用此代码示例。对于因将此代码示例用于其他用途而出现的偶然或必然的损害,Microsoft 不承担任何责任。

在 Visual Studio 中生成并运行“委托”示例

  1. 打开解决方案 (Delegates.sln)。

  2. 在“解决方案资源管理器”中,右击“Delegates1”项目并单击“设为启动项目”。

  3. 在“调试”菜单上单击“开始执行(不调试)”。

  4. 对于 Delegates2,请重复前面的步骤。

从命令行生成并运行“委托”示例

  1. 使用“更改目录”命令转到“Delegates1”目录。

  2. 键入以下命令:

    csc bookstore.csbookstore
  3. 使用“更改目录”命令转到“Delegates2”目录。

  4. 键入以下命令:

    csc compose.cscompose
1.B,示例代码(Sample Code)返回顶部

1.B.1, bookstore.cs

技术分享
// 版权所有(C) Microsoft Corporation。保留所有权利。// 此代码的发布遵从// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。////版权所有(C) Microsoft Corporation。保留所有权利。// bookstore.csusing 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;      }   }   // 声明一个用于处理书的委托类型:   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));      }      // 对每本平装图书调用传入委托来进行处理:       public void ProcessPaperbackBooks(ProcessBookDelegate processBook)      {         foreach (Book b in list)          {            if (b.Paperback)            // 调用该委托:               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("Average Paperback Book Price: ${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);      }   }}
View Code

1.B.2,

1.B,示例代码2(Sample Code)返回顶部

1.B.1, compose.cs

技术分享
// 版权所有(C) Microsoft Corporation。保留所有权利。// 此代码的发布遵从// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。////版权所有(C) Microsoft Corporation。保留所有权利。// compose.csusing System;delegate void MyDelegate(string s);class MyClass{    public static void Hello(string s)    {        Console.WriteLine("  Hello, {0}!", s);    }    public static void Goodbye(string s)    {        Console.WriteLine("  Goodbye, {0}!", s);    }    public static void Main()    {        MyDelegate a, b, c, d;        // 创建引用 Hello 方法的         // 委托对象 a:        a = new MyDelegate(Hello);        // 创建引用 Goodbye 方法的         // 委托对象 b:        b = new MyDelegate(Goodbye);        // a 和 b 两个委托组成 c,         // c 将按顺序调用这两个方法:        c = a + b;        // 从组合委托中移除 a 而保留 d,         // 后者仅调用 Goodbye 方法:        d = c - a;        Console.WriteLine("Invoking delegate a:");        a("A");        Console.WriteLine("Invoking delegate b:");        b("B");        Console.WriteLine("Invoking delegate c:");        c("C");        Console.WriteLine("Invoking delegate d:");        d("D");    }}
View Code

1.B.2,

1.C,下载地址(Free Download)返回顶部

 

技术分享作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

ylbtech-LanguageSamples-Delegates(委托)