关于委托...谁能帮我解释下这代码...

mmbf001 2009-04-01 09:56:08

// 版权所有 (C) Microsoft Corporation。保留所有权利。

// bookstore.cs
using System;

// 用于处理书店的一组类:
namespace Bookstore
{
using System.Collections;

#region"Book Struct"
// 描述图书列表中的一本书:
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;
}
}
#endregion

// 声明一个用于处理书的委托类型:
public delegate void ProcessBookDelegate(Book book);

// 维护一个图书数据库。
public class BookDB
{
// 列出数据库中的所有图书:
ArrayList list = new ArrayList();

// 向数据库中添加图书:
public void AddBook(string title, string author, decimal price, bool paperBack)
{
list.Add(new Book(title, author, price, paperBack));
}

// 对每本平装图书调用传入委托来进行处理:
public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
{
foreach (Book b in list)
{
if (b.Paperback)
// 调用该委托:
processBook(b);
}
}
}
}

// 使用 Bookstore 类:
namespace BookTestClient
{
using Bookstore;

// 计算图书总价格和平均价格的类:
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 Test
{
// 打印书名。
static void PrintTitle(Book b)
{
Console.WriteLine(" {0}", b.Title);
}

// 下面开始执行。
static void Main()
{
BookDB bookDB = new BookDB();

// 用一些书初始化数据库:
AddBooks(bookDB);

// 打印所有平装本的书名:
Console.WriteLine("Paperback Book Titles:");
// 创建一个与静态方法 Test.PrintTitle 关联的
// 新委托对象:
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));

// 使用 PriceTotaller 对象
// 获取平装本的平均价格:
PriceTotaller totaller = new PriceTotaller();
// 创建一个与 对象 totaller 的非静态方法
// AddBookToTotal 关联的新委托对象:
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
totaller.AveragePrice());
Console.Read();
}

#region"初始化数据"
// 用一些测试图书初始化图书数据库:
static void AddBooks(BookDB bookDB)
{
bookDB.AddBook("The C Programming Language",
"Brian W. Kernighan and Dennis M. Ritchie", 19.95m, true);
bookDB.AddBook("The Unicode Standard 2.0",
"The Unicode Consortium", 39.95m, true);
bookDB.AddBook("The MS-DOS Encyclopedia",
"Ray Duncan", 129.95m, false);
bookDB.AddBook("Dogbert's Clues for the Clueless",
"Scott Adams", 12.00m, true);
}
#endregion

}
}


ProcessPaperbackBooks(ProcessBookDelegate processBook)以及bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));看不懂...
前面看的一个MS的委托例子是实例化委托,传入方法名,比较好理解...可是这个实在是看不懂...虽然有注释.....寒...
不想太浪费时间了,麻烦高手们帮助我理解一下....
...全文
170 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
melon23 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mmbf001 的回复:]
看了楼上各位的回答特别是5楼朋友,又一步步跟了一下基本弄清楚了...谢谢大家
可能看的前一个例子太简单了,所以看到这个就点迷糊了.
我总结一下,不知理解的是否正确
1,定义了一个委托,只要方法参数与委托的参数一致就可以使这个委托"多次"指向"多个这样符合条件的"方法?
这里指向的方法多了是否有可能会引起混乱呢?
2,被指向的方法必须处理好"返回的结果"(不特指返回值)
3,吃饭去...
[/Quote]
1、可以指向多个方法,当调用委托时,所以指向的方法依次被调用,不会混乱。
2、当指向多个方法时,委托必须定义为 void(即无返回值),当然所关联的方法也是void。否则只返回最后一个方法的值。
mmbf001 2009-04-01
  • 打赏
  • 举报
回复
看了楼上各位的回答特别是5楼朋友,又一步步跟了一下基本弄清楚了...谢谢大家
可能看的前一个例子太简单了,所以看到这个就点迷糊了.
我总结一下,不知理解的是否正确
1,定义了一个委托,只要方法参数与委托的参数一致就可以使这个委托"多次"指向"多个这样符合条件的"方法?
这里指向的方法多了是否有可能会引起混乱呢?
2,被指向的方法必须处理好"返回的结果"(不特指返回值)
3,吃饭去...
总哈哈 2009-04-01
  • 打赏
  • 举报
回复
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
new ProcessBookDelegate(PrintTitle) 这个你把它理解成要传一个方法进去就可以了,要传哪个方法呢,要传的是PrintTitle方法,但是不能直接放进去,应为委托也要实例化一次,所以就有了new ProcessBookDelegate(PrintTitle)了。
总哈哈 2009-04-01
  • 打赏
  • 举报
回复
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
new ProcessBookDelegate(PrintTitle) 这个你把它理解成要传一个方法进去就可以了,要传哪个方法呢,要传的是PrintTitle方法,但是不能直接放进去,应为委托也要实例化一次,所以就有了new ProcessBookDelegate(PrintTitle)了。
renzhezhiye1 2009-04-01
  • 打赏
  • 举报
回复
1、ProcessPaperbackBooks(ProcessBookDelegate processBook)//此处的processBook相当于一个方法
2、bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));

相当于ProcessBookDelegate processBook = new ProcessBookDelegate(totaller.AddBookToTotal)
bookDB.ProcessPaperbackBooks(processBook );

应该理解了吧?
cuike519 2009-04-01
  • 打赏
  • 举报
回复
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));

解释一下这句吧,ProcessPaperbackBooks是一个函数,这个函数的参数是另外一个函数(传入一个委托实例),有点像C++函数指针。在函数体内再调用传入的函数实例。
melon23 2009-04-01
  • 打赏
  • 举报
回复
1、
public delegate void ProcessBookDelegate(Book book);
注: 定义一个委托类,即类ProcessBookDelegate继承自System.MulticastDelegate。
2、 new ProcessBookDelegate(totaller.AddBookToTotal)
注:既然委托是一个类,就要实例化,构造函数只有一个参数,即方法地址totaller.AddBookToTotal
3、 bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
注:当委托类实例化(关联了相关的方法),就可以调用了:
public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
{
foreach (Book b in list)
{
if (b.Paperback)
// 调用该委托:
processBook(b); //processBook就是new ProcessBookDelegate(totaller.AddBookToTotal)
}
}

闽南卤面 2009-04-01
  • 打赏
  • 举报
回复
关注中
xwk789789xwk 2009-04-01
  • 打赏
  • 举报
回复
ProcessPaperbackBooks(ProcessBookDelegate processBook)主要是定义了一个方法ProcessPaperbackBooks(),该方法以一个委托方法processBook作为参数,其实processBook也是一个方法;
至于bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));则是调用了bookDB中的方法ProcessPaperbackBooks(),其中该方法以totaller.AddBookToTotal()这个方法作为参数来调用。
不知这样解释楼主能不能听懂,可能说的不太好,呵呵,表达能力有限。
zhuanshen712 2009-04-01
  • 打赏
  • 举报
回复
怎么不懂了?
看看这个:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html
还不懂得话找我!
无先生 2009-04-01
  • 打赏
  • 举报
回复
定义委托然后下面是调用委托执行

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧