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