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);
      }
   }
}

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");
    }
}

1.B.2,

1.C,下载地址(Free Download)返回顶部
作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
时间: 2024-10-15 18:31:26

ylbtech-LanguageSamples-Delegates(委托)的相关文章

【Xamarin笔记】Events, Protocols and Delegates

Events, Protocols and Delegates   事件.协议和委托 This article presents the key iOS technologies used to receive callbacks and to populate user interface controls with data. These technologies are events, protocols, and delegates. This article explains what

ios委托(Delegates)示例

假设对象A调用B来执行一项操作,操作一旦完成,对象A就必须知道对象B已完成任务且对象A将执行其他必要操作. 在上面的示例中的关键概念有 A是B的委托对象 B引用一个A A将实现B的委托方法 B通过委托方法通知 创建一个委托(Delegates)对象 1. 创建一个单一视图的应用程序 2. 然后选择文件 File -> New -> File... 3. 然后选择Objective C单击下一步 4. 将SampleProtocol的子类命名为NSObject,如下所示 5. 然后选择创建 6.

C#委托使用详解(Delegates)

摘要 委托是C#编程一个非常重要的概念,也是一个难点.本文将系统详细讲解委托. 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解:  (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.

【C#】C#委托使用详解(Delegates)

摘要 委托是C#编程一个非常重要的概念,也是一个难点.本文将系统详细讲解委托. 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解:  (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.

ylbtech-Unitity-CS:Delegates

ylbtech-Unitity-CS:Delegates 1.A,效果图返回顶部 Invoking delegate a: Hello, A! Invoking delegate b: Goodbye, B! Invoking delegate c: Hello, C! Goodbye, C! Invoking delegate d: Goodbye, D! 请按任意键继续. . . 1.B,源代码返回顶部 1.B.1,bookstore.cs // bookstore.cs using Sys

[转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委托是一个类型,是一个函数指针类型,这个类型将该委托的实例化对象所能指向的函数的细节封装起来了,即规定了所能指向的函数的签名,也就是限制了所能指向的函数的参数和返回值.当实例化委托的时候,委托对象会指向某一个匹配的函数,实质就是将函数的地址赋值给了该委托的对象,然后就可以通过该委托对象来调用所指向的函

ylbtech-LanguageSamples-AnonymousDelegates(匿名委托)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-AnonymousDelegates(匿名委托) 1.A,示例(Sample) 返回顶部 “匿名委托”示例 本示例演示了如何使用匿名委托来计算员工的薪水奖金.使用匿名委托简化了程序,因为无需再定义一个单独的方法. 每个雇员的数据都存储在一个对象中,该对象包含个人详细信息和一个引用计算奖金所需的算法的委托.通过以委托的方式定义算法,可以使用相同的方法来执行奖金计算,而与实际计算方式无关.

失败的大牛事件委托,与我的委托

看了网上大牛的DELPHI事件委托,实际用起来是有BUG的.代码如下: unit faDelegate; interface uses Generics.collections, TypInfo, ObjAuto, SysUtils;type Event = class private FMethods : TList<TMethod>; FInternalDispatcher: TMethod; //悲催的是泛型类的方法不能内嵌汇编,只能通过一个非泛型的父类来实现 procedure Int

委托示例

最简单的委托示例: 1 // 该委托可以指向任何传入两个整数并返回一个整数的方法 2 public delegate int BinaryOp( int x, int y ); 3 public class SimpleMath 4 { 5 public int Add( int x, int y ) 6 { return x + y; } 7 public int Subtract( int x, int y ) 8 { return x - y; } 9 public static int