熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

關於.NET的委托[1]

2013-11-13 12:16:49  來源: .NET編程 

  NET學習中你碰到過委托嗎?我接觸NET幾個月以來關於委托的確花了我好長時間才弄明白這裡我就C#中的委托給大家介紹一下(先說定義和特征然後用例子說明)

  委托是回調函數的類型安全包裝C++編寫的非托管程序進行回調時很容易出錯由於委托的存在托管應用程序不會出現這樣的情況委托通常用來定義響應事件的回調方法的簽名

  C#中的委托類似於C或C++中的函數指針使用委托使程序員可以將方法引用封裝在委托對象內( 所以這裡的引用不是原始內存地址而是包裝了方法的內存地址的委托實例 )然後可以將給委托對象傳遞可調用所引用方法的代碼而不必在編譯時知道將調用哪個方法與C或C++中的函數指針不同委托是面向對象類型安全的並且是安全的

  委托聲明定義一種類型它用一組特定的參數以及返回類型封裝方法

  對於靜態方法委托對象封裝要調用的方法

  對於實例方法委托對象同時封裝一個實例和該實例上的一個方法

  如果你有一個委托對象和一組適當的參數則可以用這些參數調用該委托

  委托的一個有趣且有用的屬性是 它不知道或不關心自己引用的對象的類任何對象都可以知識方法的參數類型必須與委托的參數類型和返回類型相匹配這是的委托完全適合匿名調用

  到現在已經說得不少了現在開始用例子說明如何聲明實例化和調用委托

  下面的示例中BookDB 類封裝一個書店數據庫它維護一個書籍數據庫它公開 ProcessPaperbackBooks 方法該方法在數據庫中查找所有平裝書並為每本書調用一個委托所使用的 delegate 類型稱為 ProcessBookDelegateTest 類使用該類輸出平裝書的書名和平均價格委托的使用促進了書店數據庫和客戶代碼之間功能的良好分隔客戶代碼不知道書籍的存儲方式和書店代碼查找平裝書的方式書店代碼也不知道找到平裝書後將對平裝書進行什麼處理

 // bookstorecs
using System;

//此命名空間中的幾個類用以維護書籍數據庫:
namespace Bookstore
{
   using SystemCollections;

   // 描述數據庫中每一本書具有的屬性:
   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)
      {
         listAdd(new Book(title author price paperBack));
      }

      // 對於每一本平裝書調用ProcessBookDelegate這個委托以對平裝書進行處理:
      public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
      {
         foreach (Book b in list)
         {
            if (bPaperback)
            // Calling the delegate:
               processBook(b);
         }
      }
   }
}

// 使用Bookstore命名空間裡的類:
namespace BookTestClient
{
   using Bookstore;

   // 具有統計平裝書並求出平裝書的平均價格功能的類:
   class PriceTotaller
   {
      int countBooks = ;
      decimal priceBooks = m;

      internal void AddBookToTotal(Book book)
      {
         countBooks += ;
         priceBooks += bookPrice;
      }

      internal decimal AveragePrice()
      {
         return priceBooks / countBooks;
      }
   }

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15563.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.