Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > 关于.NET的委托
【标  题】:关于.NET的委托
【关键字】:.NET
【来  源】:http://blog.csdn.net/jianbao/archive/2006/11/21/1401771.aspx

关于.NET的委托

Your Ad Here

.NET学习中,你碰到过委托吗?我接触.NET几个月以来,关于委托的确花了我好长时间才弄明白,这里我就C#中的委托给大家介绍一下。(先说定义和特征,然后用例子说明)

    委托是回调函数的类型安全包装。C++编写的非托管程序进行回调时很容易出错。由于委托的存在,托管应用程序不会出现这样的情况。委托通常用来定义响应事件的回调方法的签名。
    C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内所以这里的“引用”不是原始内存地址,而是包装了方法的内存地址的委托实例 。然后可以将给委托对象传递可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。
    委托声明定义一种类型,它用一组特定的参数以及返回类型封装方法。
           对于静态方法,委托对象封装要调用的方法。
           对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。
    如果你有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。
    委托的一个有趣且有用的属性是: 它不知道或不关心自己引用的对象的类。任何对象都可以,知识方法的参数类型必须与委托的参数类型和返回类型相匹配。这是的委托完全适合“匿名”调用。
    到现在已经说得不少了,现在开始用例子说明如何声明、实例化和调用委托:
   下面的示例中,BookDB 类封装一个书店数据库,它维护一个书籍数据库。它公开 ProcessPaperbackBooks 方法,该方法在数据库中查找所有平装书,并为每本书调用一个委托。所使用的 delegate 类型称为 ProcessBookDelegateTest 类使用该类输出平装书的书名和平均价格。委托的使用促进了书店数据库和客户代码之间功能的良好分隔。客户代码不知道书籍的存储方式和书店代码查找平装书的方式。书店代码也不知道找到平装书后将对平装书进行什么处理。

 

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

   }


   
// 为处理平装书的类声明一个委托类型(delegate类型):
   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));
      }


      
// 对于每一本平装书调用ProcessBookDelegate这个委托,以对平装书进行处理: 
      public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
      
{
         
foreach (Book b in list) 
         
{
            
if (b.Paperback)
            
// Calling the delegate:
               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(
"平装书的平均价格: ${0:#.##}",
            totaller.AveragePrice());
      }


      
// 向数据库添加书以初始化书籍数据库:
      static void AddBooks(BookDB bookDB)
      
{
         bookDB.AddBook(
"The C Programming Language"
            
"Brian W. Kernighan and Dennis M. Ritchie"19.95mtrue);
         bookDB.AddBook(
"The Unicode Standard 2.0"
            
"The Unicode Consortium"39.95mtrue);
         bookDB.AddBook(
"The MS-DOS Encyclopedia"
            
"Ray Duncan"129.95mfalse);
         bookDB.AddBook(
"Dogbert's Clues for the Clueless"
            
"Scott Adams"12.00mtrue);
      }

   }

}


输出:
Paperback Book Titles:
   The C Programming Language
   The Unicode Standard 
2.0
   Dogbert
's Clues for the Clueless
平装书的平均价格: $23.97

 

声明委托   以下语句: 
                                                                                                                                
public delegate void ProcessBookDelegate(Book book);
声明一个新的委托类型。每个委托类型都描述参数的数目和类型,以及它可以封装的方法的返回值类型。每当需要一组新的参数类型或新的
返回值类型时,都必须声明一个新的委托类型。                                                                            
实例化委托   
声明了委托类型后,必须创建委托对象并使之与特定方法关联。与所有其他对象类似,新的委托对象用 new 表达式创建。
但是当创建委托时,传递给 new 表达式的参数很特殊:它的编写类似于方法调用,但没有方法的参数。
下列语句:                                                    
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
创建与静态方法 Test.PrintTitle 关联的新的委托对象。







下列语句:

bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
创建与对象 totaller 上的非静态方法 AddBookToTotal 关联的新的委托对象。在例子中,新的委托对象都立即传递给 ProcessPaperbackBooks 方法。

请注意一旦创建了委托,它所关联到的方法便永不改变:委托对象不可改变。
调用委托   
创建委托对象后,通常将委托对象传递给将调用该委托的其他代码。通过委托对象的名称(后面跟着要传递给委托的参数,括在括号内)
调用委托对象。下面是委托调用的示例:
processBook(b);
Lucene中文分词组件:【上一篇】
[DevExpress控件应用]XtraNavBar: 实现弹出快捷菜单功能:【下一篇】
【相关文章】
  • WinCE 4.2(.net精简框架集)下的图形双缓存处理
  • asp.net基础知识
  • 屏蔽CHtmlViewWebBrower控件右键菜单技巧合集_转载自http://www.binzi.net/html/vc/2006/0902/10050.html
  • ASP.NET AJAX 首部曲 - 迈向解密之路
  • 微软发布Enterprise Library for .NET Framework 2.0在32位和64位平台上的性能比较测试文档
  • 在 ASP.NET 2.0 中上载文件
  • 在C#.NET中,如何生成PDF文件?主要有以下几个途径:
  • 深入理解 ASP.NET 动态控件 (Part 3 - 页面生命周期)
  • 注册起动脚本,ASP.NET AJAX的一项重要功能!
  • CardViewer系列之准备篇--J2ME vs .netCF
  • 【随机文章】
  • [编程夜未眠]..你的Css真漂亮,不过不符合我的风格,还是自己手工改改好了
  • 广告做到留言里面去了!!
  • SQL语句基本的用法
  • 《设计模式精解》学习笔记(十五)------FactoryMethod(工厂方法)模式
  • FC6.0安装后的分辨率问题
  • 更改控制台的分辨率(grub)
  • Linux系统配置jsp服务器的简明步骤
  • 我的问题--字符编码 内码 交换码
  • .net 2005 环境下,写Microsoft Outlook的Add-in的注意事项
  • 系统架构,框架,设计模式的理解--举例说明
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.