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;
}
}
[] []