zoukankan      html  css  js  c++  java
  • 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

    // 版权所有(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

    // 版权所有(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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    PowerShell 学习(一):运算符
    Create word clouds with Wordle
    淘宝惊现“同店购”?
    “二叉查找树”学习
    云计算软件之——OpenNebula
    "栈"应用——求解迷宫
    "队列"学习
    “串”学习——三种表示方法
    尖端技术104之计算机技术的未来
    “二叉树”——链表表示
  • 原文地址:https://www.cnblogs.com/ylbtech/p/4196989.html
Copyright © 2011-2022 走看看