青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

委托(Delegate)

C# 中的委托類似于 C C++ 中的函數(shù)指針。使用委托使程序員可以將方法引用封裝在委托對象內(nèi)。然后可以將該委托對象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時知道將調(diào)用哪個方法。與 C C++ 中的函數(shù)指針不同,委托是面向?qū)ο蟆㈩愋桶踩模⑶沂前踩摹?/span>

委托聲明定義一種類型,它用一組特定的參數(shù)以及返回類型封裝方法。對于靜態(tài)方法,委托對象封裝要調(diào)用的方法。對于實例方法,委托對象同時封裝一個實例和該實例上的一個方法。如果您有一個委托對象和一組適當?shù)膮?shù),則可以用這些參數(shù)調(diào)用該委托。

委托的一個有趣且有用的屬性是,它不知道或不關(guān)心自己引用的對象的類。任何對象都可以;只是方法的參數(shù)類型和返回類型必須與委托的參數(shù)類型和返回類型相匹配。這使得委托完全適合匿名調(diào)用。

此教程包括兩個示例:

示例 1 展示如何聲明、實例化和調(diào)用委托。

示例 2 展示如何組合兩個委托。

此外,還討論以下主題:

委托和事件

委托與接口

示例 1

下面的示例闡釋聲明、實例化和使用委托。BookDB 類封裝一個書店數(shù)據(jù)庫,它維護一個書籍數(shù)據(jù)庫。它公開 ProcessPaperbackBooks 方法,該方法在數(shù)據(jù)庫中查找所有平裝書,并為每本書調(diào)用一個委托。所使用的 delegate 類型稱為 ProcessBookDelegateTest 類使用該類輸出平裝書的書名和平均價格。

委托的使用促進了書店數(shù)據(jù)庫和客戶代碼之間功能的良好分隔。客戶代碼不知道書籍的存儲方式和書店代碼查找平裝書的方式。書店代碼也不知道找到平裝書后將對平裝書進行什么處理。

 

// bookstore.cs

using System;

 

// A set of classes for handling a bookstore:

namespace Bookstore 

{

   
using System.Collections;

   
// Describes a book in the book list:

   
public struct Book

   
{

      
public string Title;        // Title of the book.

      
public string Author;       // Author of the book.

      
public decimal Price;       // Price of the book.

      
public bool Paperback;      // Is it paperback?

      
public Book(string title, string author, decimal price, bool paperBack)

      
{

         Title 
= title;

         Author 
= author;

         Price 
= price;

         Paperback 
= paperBack;

      }


   }


   
// Declare a delegate type for processing a book:

   
public delegate void ProcessBookDelegate(Book book);

   
// Maintains a book database.

   
public class BookDB

   
{

      
// List of all books in the database:

      ArrayList list 
= new ArrayList();   

      
// Add a book to the database:

      
public void AddBook(string title, string author, decimal price, bool paperBack)

      
{

         list.Add(
new Book(title, author, price, paperBack));

      }


      
// Call a passed-in delegate on each paperback book to process it: 

      
public void ProcessPaperbackBooks(ProcessBookDelegate processBook)

      
{

         
foreach (Book b in list) 

         
{

            
if (b.Paperback)

            
// Calling the delegate:

               processBook(b);

         }


      }


   }


}


// Using the Bookstore classes:

namespace BookTestClient

{

   
using Bookstore;

   
// Class to total and average prices of books:

   
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 to test the book database:

   
class Test

   
{

      
// Print the title of the book.

      
static void PrintTitle(Book b)

      
{

         Console.WriteLine(
"   {0}", b.Title);

      }


      
// Execution starts here.

      
static void Main()

      
{

         BookDB bookDB 
= new BookDB();

         
// Initialize the database with some books:

         AddBooks(bookDB);      

         
// Print all the titles of paperbacks:

         Console.WriteLine(
"Paperback Book Titles:");

         
// Create a new delegate object associated with the static 

         
// method Test.PrintTitle:

         bookDB.ProcessPaperbackBooks(
new ProcessBookDelegate(PrintTitle));

         
// Get the average price of a paperback by using

         
// a PriceTotaller object:

         PriceTotaller totaller 
= new PriceTotaller();

         
// Create a new delegate object associated with the nonstatic 

         
// method AddBookToTotal on the object totaller:

         bookDB.ProcessPaperbackBooks(
new ProcessBookDelegate(totaller.AddBookToTotal));

         Console.WriteLine(
"Average Paperback Book Price: ${0:#.##}",

            totaller.AveragePrice());

      }


      
// Initialize the book database with some test books:

      
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

Average Paperback Book Price: $23.97

代碼討論

聲明委托 以下語句:

 

public delegate void ProcessBookDelegate(Book book);

 

聲明一個新的委托類型。每個委托類型都描述參數(shù)的數(shù)目和類型,以及它可以封裝的方法的返回值類型。每當需要一組新的參數(shù)類型或新的返回值類型時,都必須聲明一個新的委托類型。

實例化委托 聲明了委托類型后,必須創(chuàng)建委托對象并使之與特定方法關(guān)聯(lián)。與所有其他對象類似,新的委托對象用 new 表達式創(chuàng)建。但創(chuàng)建委托時,傳遞給 new 表達式的參數(shù)很特殊:它的編寫類似于方法調(diào)用,但沒有方法的參數(shù)。

下列語句:

 

bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));

 

創(chuàng)建與靜態(tài)方法 Test.PrintTitle 關(guān)聯(lián)的新的委托對象。下列語句:

 

bookDB.ProcessPaperbackBooks(new 

   ProcessBookDelegate(totaller.AddBookToTotal));

 

創(chuàng)建與對象 totaller 上的非靜態(tài)方法 AddBookToTotal 關(guān)聯(lián)的新的委托對象。在兩個例子中,新的委托對象都立即傳遞給 ProcessPaperbackBooks 方法。

請注意一旦創(chuàng)建了委托,它所關(guān)聯(lián)到的方法便永不改變:委托對象不可改變。

調(diào)用委托 創(chuàng)建委托對象后,通常將委托對象傳遞給將調(diào)用該委托的其他代碼。通過委托對象的名稱(后面跟著要傳遞給委托的參數(shù),括在括號內(nèi))調(diào)用委托對象。下面是委托調(diào)用的示例:

 

processBook(b);

 

示例 2

本示例演示組合委托。委托對象的一個有用屬性是,它們可以+運算符來組合。組合的委托依次調(diào)用組成它的兩個委托。只可組合相同類型的委托,并且委托類型必須具有 void 返回值。-運算符可用來從組合的委托移除組件委托。

 

// 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, 

        
// which calls both methods in order:

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

    }


}

 

輸出

Invoking delegate a:

  Hello, A!

Invoking delegate b:

  Goodbye, B!

Invoking delegate c:

  Hello, C!

  Goodbye, C!

Invoking delegate d:

  Goodbye, D!

委托和事件

委托非常適合于用作事件(從一個組件就該組件中的更改通知偵聽器)。

委托與接口

委托和接口的類似之處是,它們都允許分隔規(guī)范和實現(xiàn)。多個獨立的作者可以生成與一個接口規(guī)范兼容的多個實現(xiàn)。類似地,委托指定方法的簽名,多個作者可以編寫與委托規(guī)范兼容的多個方法。何時應使用接口,而何時應使用委托呢?

委托在以下情況下很有用:

調(diào)用單個方法。

一個類可能希望有方法規(guī)范的多個實現(xiàn)。

希望允許使用靜態(tài)方法實現(xiàn)規(guī)范。

希望類似事件的設(shè)計模式。

調(diào)用方不需要知道或獲得在其上定義方法的對象。

實現(xiàn)的提供程序希望只對少數(shù)選擇組件分發(fā)規(guī)范實現(xiàn)。

需要方便的組合。

接口在以下情況下很有用:

規(guī)范定義將調(diào)用的一組相關(guān)方法。

類通常只實現(xiàn)規(guī)范一次。

接口的調(diào)用方希望轉(zhuǎn)換為接口類型或從接口類型轉(zhuǎn)換,以獲得其他接口或類。

posted on 2008-01-07 11:10 楊粼波 閱讀(351) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线综合+亚洲+欧美中文字幕| 亚洲午夜国产一区99re久久| 亚洲影院免费观看| 欧美视频久久| 久久久久99| 鲁大师成人一区二区三区| 中文av一区二区| 最新国产の精品合集bt伙计| 国产一区视频观看| 国产精品久久久| 欧美日韩综合在线| 欧美大片在线观看一区| 久久人人爽人人爽爽久久| 亚洲自拍电影| 欧美www视频| 久久久久久免费| 欧美在线日韩| 香蕉久久夜色| 欧美亚洲免费高清在线观看| 在线中文字幕不卡| 在线亚洲欧美视频| 一本久久知道综合久久| 最新精品在线| 亚洲欧洲中文日韩久久av乱码| 一区二区视频免费完整版观看| 国产欧美视频在线观看| 国产精品久久久久毛片大屁完整版| 欧美日韩视频在线| 欧美资源在线| 欧美制服丝袜第一页| 新狼窝色av性久久久久久| 性伦欧美刺激片在线观看| 亚洲欧美变态国产另类| 亚洲专区一区| 亚洲主播在线观看| 欧美一区二区在线免费播放| 午夜精品美女久久久久av福利| 欧美激情视频一区二区三区在线播放| 麻豆91精品| 欧美国产视频日韩| 欧美激情一区二区| 亚洲精品欧洲精品| 一区二区精品| 亚洲男人的天堂在线aⅴ视频| 亚洲永久在线| 欧美影院一区| 久久视频国产精品免费视频在线 | 小黄鸭精品aⅴ导航网站入口| 亚洲欧美日本精品| 久久国产黑丝| 久久综合图片| 欧美日韩成人在线视频| 欧美视频在线视频| 国产女优一区| 在线精品亚洲| 日韩视频在线永久播放| 亚洲一二区在线| 久久国产欧美| 欧美成人一区二区三区片免费| 亚洲高清免费在线| 亚洲理论在线观看| 亚洲欧美激情视频| 久久亚洲国产成人| 欧美特黄视频| 狠久久av成人天堂| 国产亚洲福利社区一区| 亚洲激情网站| 亚洲综合好骚| 久久综合久久综合九色| 亚洲精美视频| 亚洲女人av| 欧美不卡一区| 国产视频精品网| 亚洲精选在线观看| 久久精品成人一区二区三区蜜臀| 欧美岛国在线观看| 亚洲视频二区| 欧美成人小视频| 国产伦精品一区二区三| 最新日韩在线| 欧美怡红院视频一区二区三区| 欧美成人综合网站| 亚洲视频在线观看| 欧美成人精品高清在线播放| 国产精品嫩草99av在线| 亚洲经典视频在线观看| 亚洲欧美日韩在线| 亚洲国产精品成人精品 | 看欧美日韩国产| 国产精品成人免费视频| 亚洲高清自拍| 亚洲电影在线看| 亚洲欧美日韩国产| 亚洲电影第1页| 欧美中文字幕不卡| 国产精品第一页第二页第三页| 欲色影视综合吧| 香蕉精品999视频一区二区 | 欧美怡红院视频| 欧美午夜久久久| 亚洲作爱视频| 欧美福利视频在线| 久久精品视频在线| 国产精品嫩草99a| 宅男精品视频| 亚洲欧洲日本mm| 老巨人导航500精品| 国产一区二区三区日韩欧美| 亚洲女ⅴideoshd黑人| 亚洲国语精品自产拍在线观看| 欧美在线一级va免费观看| 国产精品入口日韩视频大尺度| 一本色道久久综合亚洲精品按摩| 欧美承认网站| 久久久久久久久久久一区| 国产自产v一区二区三区c| 欧美一进一出视频| 亚洲一区二区三区四区在线观看| 欧美日本在线一区| 99精品国产福利在线观看免费| 欧美大片91| 欧美不卡视频一区发布| 亚洲激情视频网| 亚洲国产成人tv| 欧美aⅴ99久久黑人专区| 亚洲国产精品黑人久久久| 蜜臀a∨国产成人精品| 久久久www| 一区二区三区亚洲| 另类欧美日韩国产在线| 久久久久中文| 亚洲国产一区二区三区在线播 | 狠狠色综合网| 免费国产一区二区| 老司机午夜精品视频| 亚洲国产天堂久久综合| 亚洲国产精品视频| 欧美女激情福利| 亚洲一级高清| 亚洲免费中文字幕| 韩国av一区二区三区| 欧美成熟视频| 欧美日韩成人综合| 亚洲永久视频| 欧美亚洲综合另类| 在线成人av网站| 亚洲国产日韩一区| 欧美日韩亚洲一区二区三区在线| 亚洲午夜日本在线观看| 亚洲尤物在线| 在线观看亚洲a| 最新中文字幕一区二区三区| 欧美午夜a级限制福利片| 性伦欧美刺激片在线观看| 欧美在线一区二区三区| 最新成人av网站| 这里只有精品视频| 国产一区二区丝袜高跟鞋图片 | 久久久久国内| 久久综合影音| 亚洲一区欧美| 久久精品人人做人人爽| 99精品国产在热久久婷婷| 亚洲视频在线一区| 在线日韩中文字幕| 亚洲精品在线观看视频| 国产三级精品在线不卡| 欧美国产一区视频在线观看| 欧美三级视频在线| 久久尤物视频| 欧美日韩亚洲一区二| 久久久人成影片一区二区三区| 免费人成网站在线观看欧美高清| 亚洲一区二区三区免费观看| 欧美中文字幕在线| 夜夜爽99久久国产综合精品女不卡| 亚洲尤物在线| 日韩视频免费| 久久不见久久见免费视频1| 日韩天堂在线视频| 久久99伊人| 亚洲午夜精品久久| 久久嫩草精品久久久精品| 亚洲永久精品大片| 欧美成人亚洲| 久久综合免费视频影院| 欧美视频在线免费看| 亚洲高清精品中出| 国内外成人免费激情在线视频网站 | 亚洲一二三区视频在线观看| 亚洲国产高清高潮精品美女| 亚洲在线免费观看| 亚洲精品一区二区三区99| 欧美一区二区私人影院日本| 亚洲色在线视频| 欧美成人免费在线| 免费看亚洲片| 国产欧美一区二区精品性| 亚洲免费观看在线视频| 亚洲第一狼人社区|