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

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
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)用所引用方法的代碼,而不必在編譯時(shí)知道將調(diào)用哪個(gè)方法。與 C C++ 中的函數(shù)指針不同,委托是面向?qū)ο蟆㈩愋桶踩模⑶沂前踩摹?/span>

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

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

此教程包括兩個(gè)示例:

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

示例 2 展示如何組合兩個(gè)委托。

此外,還討論以下主題:

委托和事件

委托與接口

示例 1

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

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

 

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

 

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

實(shí)例化委托 聲明了委托類型后,必須創(chuàng)建委托對象并使之與特定方法關(guān)聯(lián)。與所有其他對象類似,新的委托對象用 new 表達(dá)式創(chuàng)建。但創(chuàng)建委托時(shí),傳遞給 new 表達(dá)式的參數(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)的新的委托對象。在兩個(gè)例子中,新的委托對象都立即傳遞給 ProcessPaperbackBooks 方法。

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

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

 

processBook(b);

 

示例 2

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

 

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

委托和事件

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

委托與接口

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

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

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

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

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

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

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

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

需要方便的組合。

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

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

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲素人在线| 韩国成人精品a∨在线观看| 一区二区欧美国产| 欧美欧美天天天天操| 一区二区三区不卡视频在线观看| 中文在线一区| 久久精品一区二区三区四区| 欧美国产精品人人做人人爱| 亚洲成人直播| 欧美人成在线视频| 久久久国产91| 欲色影视综合吧| 欧美日韩在线综合| 久久精品在线免费观看| 亚洲视频播放| 亚洲激情网站| 一区二区三区我不卡| 欧美色大人视频| 欧美电影免费观看网站| 久久久.com| 久久精品一区四区| 欧美一级淫片aaaaaaa视频| 一本久道久久综合婷婷鲸鱼| 久久精品动漫| 久久综合伊人77777麻豆| 久久精品午夜| 久久精品免视看| 国产精品网曝门| 国产精品久久久久免费a∨大胸| 欧美精品二区| 欧美激情综合亚洲一二区| 欧美激情片在线观看| 欧美精品在线看| 欧美亚州在线观看| 国产精品成人国产乱一区| 欧美日韩一区二区三区| 欧美成人一区二区三区在线观看 | 亚洲国产精品va在线看黑人动漫 | 亚洲制服欧美中文字幕中文字幕| 亚洲激情黄色| 最新国产拍偷乱拍精品| 欧美黄色影院| 亚洲国产福利在线| 亚洲精品一区二区三区婷婷月| 亚洲精品国产精品久久清纯直播 | 欧美+日本+国产+在线a∨观看| 午夜日韩视频| 玖玖国产精品视频| 老牛影视一区二区三区| 亚洲成人在线网| 亚洲日韩视频| 在线综合+亚洲+欧美中文字幕| 一区二区三区视频观看| 亚洲一级黄色av| 亚洲高清一区二区三区| 在线精品一区二区| 一本色道久久综合亚洲二区三区 | 在线成人亚洲| 久久久91精品国产| 久久久xxx| 欧美日韩国产成人在线| 国产欧美一区二区三区在线老狼| 国产麻豆9l精品三级站| 国产午夜精品理论片a级探花| 国产亚洲一区精品| 亚洲日本黄色| 欧美伊人久久| 亚洲天堂成人在线观看| 午夜在线观看欧美| 欧美成人首页| 好男人免费精品视频| 日韩亚洲欧美一区| 午夜精品国产精品大乳美女| 欧美aaa级| 午夜精品理论片| 欧美激情成人在线| 国产亚洲欧美日韩美女| 国产精品高精视频免费| 欧美国产一区在线| 国产亚洲一区二区三区在线观看| 亚洲性视频h| 欧美二区视频| 久久大香伊蕉在人线观看热2| 欧美日韩精品在线观看| 在线成人国产| 久久麻豆一区二区| 亚洲自拍偷拍视频| 久久一区中文字幕| 国内一区二区三区在线视频| 亚洲欧美综合另类中字| 99精品国产福利在线观看免费| 麻豆精品精华液| 韩日午夜在线资源一区二区| 亚洲一区二区成人| 欧美一区高清| 麻豆精品在线播放| 欧美中在线观看| 国产亚洲电影| 久久国产一区二区| 亚洲欧美日韩国产成人| 欧美视频你懂的| 亚洲婷婷在线| 亚洲国产成人av好男人在线观看| 久久久不卡网国产精品一区| 一区二区三区国产盗摄| 亚洲激情自拍| 久久综合色88| 136国产福利精品导航网址应用| 欧美影院成年免费版| 99这里只有精品| 牛牛影视久久网| 国产精品你懂的在线| 一本色道**综合亚洲精品蜜桃冫| 91久久精品美女高潮| 欧美精品自拍| 亚洲午夜在线视频| 亚洲欧美一级二级三级| 狠狠色2019综合网| 亚洲国产女人aaa毛片在线| 欧美日韩亚洲综合一区| 亚洲一区在线播放| 亚洲女性裸体视频| 又紧又大又爽精品一区二区| 欧美激情第六页| 欧美日韩不卡一区| 亚洲淫片在线视频| 欧美在线观看视频一区二区| 一区三区视频| 一本大道久久精品懂色aⅴ | 91久久久在线| 欧美三级特黄| 亚洲欧美日韩区| 久久免费视频网| 亚洲深夜激情| 亚洲黄色在线| 国产精品自拍网站| 欧美激情精品久久久久久黑人 | 欧美专区在线| 国产精品入口麻豆原神| 亚洲免费视频中文字幕| 午夜精品久久久久| 国产精品自拍视频| 久久av一区二区三区| 久久精品国产69国产精品亚洲 | 国内精品视频在线观看| 欧美一级成年大片在线观看| 欧美专区在线| 影音欧美亚洲| 欧美国产先锋| 亚洲小视频在线观看| 亚洲欧美日韩一区二区三区在线观看 | 欧美精品九九99久久| 亚洲美洲欧洲综合国产一区| 亚洲天堂网在线观看| 国产精品视频网址| 欧美在线播放| 亚洲国产精品久久| 一区二区免费在线观看| 国产欧美日韩三区| 久久亚洲欧美国产精品乐播| 亚洲第一黄网| 欧美视频在线免费看| 亚洲制服丝袜在线| 欧美成人情趣视频| 日韩一区二区高清| 国产精品婷婷午夜在线观看| 久久九九久精品国产免费直播| 亚洲第一精品电影| 亚洲在线第一页| 影音先锋在线一区| 欧美日精品一区视频| 久久se精品一区二区| 亚洲国产精品久久久久婷婷老年| 亚洲一区二区网站| 在线观看一区| 国产精品视频导航| 你懂的网址国产 欧美| 宅男精品导航| 欧美顶级艳妇交换群宴| 午夜精品影院在线观看| 亚洲日本va午夜在线影院| 国产精品伊人日日| 欧美精品在线一区| 久久躁日日躁aaaaxxxx| 亚洲一区二区三区中文字幕| 女人天堂亚洲aⅴ在线观看| 亚洲欧美精品在线| 一区二区三区av| 亚洲丰满少妇videoshd| 国产精品日韩一区| 欧美理论在线| 免费h精品视频在线播放| 午夜精品久久久久久久久| 亚洲精品网址在线观看| 欧美大片国产精品| 久久久久久久欧美精品| 亚洲欧美在线视频观看| 亚洲天堂第二页| 夜夜爽夜夜爽精品视频| 亚洲福利电影|