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.cs
    
    bookstore
  3. 使用“更改目录”命令转到“Delegates2”目录。

  4. 键入以下命令:

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

1.B.1, bookstore.cs

ylbtech-LanguageSamples-Delegates(委托)
// 版权所有(C) Microsoft Corporation。保留所有权利。

// 此代码的发布遵从

// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。

//

//版权所有(C) Microsoft Corporation。保留所有权利。



// 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;

      }

   }



   // 声明一个用于处理书的委托类型:

   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

ylbtech-LanguageSamples-Delegates(委托)
// 版权所有(C) Microsoft Corporation。保留所有权利。

// 此代码的发布遵从

// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。

//

//版权所有(C) Microsoft Corporation。保留所有权利。



// compose.cs

using 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)返回顶部

 

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

你可能感兴趣的:(language)