delegate委托:
三个概念:
C# 中的委托类似于 C 或 C++ 中的函数指针。
委托是面向对象、类型安全的,并且是安全的。
委托和接口的类似之处是:它们都允许分隔规范和实现。
一个原则:
被托管函数的返回和参数必须和声明的托管相同;
基于这三个概念来看这个例子,这是微软的教程上讲的一个例子:
示例阐释声明、实例化和使用委托。BookDB 类封装一个书店数据库,它维护一个书籍数据库。它公开 ProcessPaperbackBooks 方法,该方法在数据库中查找所有平装书,并为每本书调用一个委托。所使用的 delegate 类型称为 ProcessBookDelegate。Test 类使用该类输出平装书的书名和平均价格。
委托的使用促进了书店数据库和客户代码之间功能的良好分隔。客户代码不知道书籍的存储方式和书店代码查找平装书的方式。书店代码也不知道找到平装书后将对平装书进行什么处理。
using System;
namespace Bookstore
{
   using System.Collections;
//1 声明Book
   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;
      }
   }
   //2 托管声明:注意参数是Book,返回值void
   public delegate void ProcessBookDelegate(Book book);
  //3 书库
   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)
           //12.processBook,他的调用和在运行是调用的就是PrintTitle()
               processBook(b);
         }
      }
   }
}
// 4 使用端
namespace BookTestClient
{
   using Bookstore;
// Class to total and average prices of books:
   class PriceTotaller
   {
      int countBooks = 0;
      decimal priceBooks = 0.0m;
 //internal 修饰符使类、接口或成员仅在当前包中可见。     
        //当前包之外的代码不能访问 internal 成员。
       //在全局范围内,internal 修饰符与 public 修饰符相同
      internal void AddBookToTotal(Book book)
      {
         countBooks += 1;
         priceBooks += book.Price;
      }
internal decimal AveragePrice()
      {
         return priceBooks / countBooks;
      }
   }
//5.测试
   class Test
   {
      // 打印书名
      static void PrintTitle(Book b)
      {
         Console.WriteLine("   {0}", b.Title);
      }
// 6 开始
      static void Main()
      {
 //构造书库,这不必细说,从BookDB可以看很明白
         BookDB bookDB = new BookDB();
// 7初始化书库,函数在往下找8
         AddBooks(bookDB);     
// 10 打印所有平装书
         Console.WriteLine("Paperback Book Titles:");
         // 11.关键点到了,新建了一个托管对象,参数是Test.PrintTitle
         // 什么意思呢?先看PrintTitle(),他的参数和返回值和声明的托管
 //要求的一致,我得理解是把这个函数的引用或者函数指针封装之后,当作参数
 //交给函数ProcessPaperbackBooks  向上到12
         bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
//13 同样的函数只要和委托在返回和参数上相同,就可以用了!
         PriceTotaller totaller = new PriceTotaller();
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
         Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
            totaller.AveragePrice());
      }
// 8 把书存到里面
      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);
      }
   }
}
另外:委托对象的一个有用属性是,它们可以“+”运算符来组合。组合的委托可调用组成它的那两个委托。只有相同类型的委托才可以组合。
“-”运算符可用来从组合的委托移除组件委托。
// 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;
// Create the delegate object a that references
        // the method Hello:
        a = new MyDelegate(Hello);
        // Create the delegate object b that references
        // the method Goodbye:
        b = new MyDelegate(Goodbye);
        // The two delegates, a and b, are composed to form c:
        c = a + b;
        // Remove a from the composed delegate, leaving d,
        // which calls only the method 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");
    }
}

转载于:https://blog.51cto.com/programmingart/42955

delegate委托相关推荐

  1. Strategy模式与Delegate委托

    Strategy模式是对算法的封装.即使是一个计算行为,如果其实现有其多样性,为达到易扩展的目的,我们也有必要将其抽象出来,以接口的形式来定义.由于充分利用了面向对象的多态性,在调用该行为时,其具体的 ...

  2. C# Delegate(委托)与多线程

    C# Delegate(委托)与多线程 很多时候写windows程序都需要结合多线程,在.net中用如下得代码来创建并启动一个新的线程.     public void ThreadProc();   ...

  3. 【C#学习】delegate(委托) 和 event(事件)

    C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.在C#中方法不能作为参数直接传递,必须 ...

  4. 转:终于会用c#中的delegate(委托)和event(事件)了

    第一个例子: public class DelegateTest {// 声明delegate对象 public delegate void CompareDelegate(int a,int b); ...

  5. Delegate委托的使用

    Delegate委托的使用 委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象 ...

  6. UE4 C++:Delegate委托

    目录 概念 定义 声明委托 单播委托 声明宏 绑定委托 执行函数 用法示例 不带参数Delegate 带参数Delegate 传递有效负载数据 多播委托 声明宏 绑定多播委托 多播执行 动态委托 声明 ...

  7. C#学习基本概念之关键字---delegate(委托)

    委托类型的声明与方法签名相似,  有一个返回值和任意数目任意类型的参数: public delegate void TestDelegate(string message); public deleg ...

  8. Csharp关键字----delegate(委托)

    Delegate类简介 ------------------------      命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 委托(Delegate)类是一 ...

  9. delegate 委托方法

    一先定义一个委托方法 ---------第一个类XX //定议委托 public event ordinary Ordinary; //定议委托方法 public delegate void ordi ...

最新文章

  1. R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放、hclust包层次聚类(创建距离矩阵、聚类、绘制树状图dendrogram,在树状图上绘制红色矩形框)
  2. Document,Node,Element,HTMLDocument ,HTMLCollection,HTMLElement,NodeList
  3. 转载:flash 跨域 crossdomain.xml
  4. 第14讲:Selenium 的基本使用
  5. 如何在 C# 中使用 Attribute
  6. [转载] python异常和错误有什么区别_python的错误和异常
  7. 软件工程 第三章 需求分析
  8. 最近十年诞生的6种新编程语言
  9. Cadence学习之路:什么是PCB工艺的正片与负片
  10. 魔改大西瓜源码下载之后画面显示只有一半的解决方法
  11. T语言与快速开发平台之天宇联iOS开发手册
  12. 给一个朋友创业公司商业计划书的建议
  13. FPGA中ISE软件调用IP核导入(.coe)文件并绘制正弦函数
  14. 深度学习100问之提高深度学习模型训练效果(调参经验)
  15. http://www.yesky.com/424/163424.shtml http://www.yesky.com/424/163424.shtml
  16. 计算机毕业设计Java大学生学籍管理系统(源码+系统+mysql数据库+lw文档)
  17. C#开发之Excel录入
  18. 用 Python 写脚本发送工作周报
  19. 分享:笔记本电脑有杂音解决技巧
  20. ip地址在同一网段什么意思

热门文章

  1. WPF学习笔记——设置ListBox选中项的背景颜色
  2. 函数作为变量,类型---golang
  3. IT工程师实战英语之一
  4. lvds接口屏线安装图解_液晶屏LVDS线类型图文讲解
  5. 互联网协议 — 互联网的技术发展
  6. 数据结构 — B+ 树
  7. VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计
  8. 一文详解为什么Serverless比其他软件开发方法更具优势
  9. 英国EE:启动TechCity 2.0 首期将部署LTE-Advanced Pro
  10. 部署 instance 到 OVS vlan100 - 每天5分钟玩转 OpenStack(138)