首页 > 开发 > 综合 > 正文

天天学C#-委托

2024-07-21 02:18:47
字体:
来源:转载
供稿:网友
国内最大的酷站演示中心!
对学过c/c++的来说,delegate就相当于函数指针,看下面的代码:

class person

{

public person(string name)

{

this.name=name;

}

//一些属性和方法

string name;

public void eat(food food);

}

person类有一个eat方法,对它的实例来说,张三,李四,王五都有他们自己的eat方法

person zhansan,lisi,wangwu;

zhansan=new person(”张三”);

lisi=new person(”李四”);

wangwu=new person(”王五”);

我们可以通过定义一个委托来分别调用eat方法

public void delegate eat(food food);

如果想调用zhansan.eat(food)

eat zhansaneat=new eat(zhansan.eat);

其他类似:

eat lisieat=new eat(lisi.eat);

eat wangwu=new eat(wangwu.eat);

这样调用zhansaneat(food)就相当于调用zhansan.eat(food)

委托最有用的是委托链,如果张三,李四,王五共同进餐

则可以定义委托如下

//定义复合委托

eat togethereat;

//c#中通过“+“将方法connect到委托,即将委托加到委托链中

//通过“-”将方法从委托链中删除

togethereat=zhansaneat+lisieat+wangwueat;

//张三,李四,王五一起吃西瓜

togethereat(西瓜);

//不带张三,只有李四和王五吃

togethereat=lisieat+wangwueat;

togethereat(西瓜);

.net中的事件机制就是通过委托来实现的。

下面是c#技术揭密上的一段源代码,我加了一些注释,讲解了事件的实现机制


//inventorymanager类用于更新库存量,它也定义了当更新库存量时应该触发的事件,也就是说它发布一个委托由订阅者调用
//inventorywatcher类定义的是订阅者,可以选择是否将自己添加到发布者的列表中,从而在更新库存时,得到通知
using system;

namespace delegateevents
{
//定义eventargs的派生类,用来携带事件信息
class inventorychangeeventargs:system.eventargs
{
public inventorychangeeventargs(string sku,int change)
{
this.sku=sku;
this.change= change;
}
string sku;
public string sku
{
get{return sku;}
}
int change;
public int change
{
get{return change;}
}
}
//发布者
class inventorymanager
{
//声明一个委托,两个参数必不可少,第一个是发布者对象,第二个一定要是eventargs类或者其派生类
public delegate void inventorychangeeventhandler(object source,inventorychangeeventargs e);
//定义该委托的事件实例(即委托链,用于订阅者将自己加到委托链中
public event inventorychangeeventhandler oninventorychangehandler;
//inventorymanager的方法,用于更新库存
public void updateinventory(string sku,int change)
{
if(0==change)
return;
//定义事件参数实例,传递sku和change信息
inventorychangeeventargs e=new inventorychangeeventargs(sku,change);
//判断委托链表是否为空,如果不空,说明有订阅者订阅
if(this.oninventorychangehandler!=null)
{
console.writeline("[inventorymanager.updateinventory] raising event to all subscribers.../n");
//依次调用委托链表上的方法
this.oninventorychangehandler(this,e);
}
}
}
//订阅者
class inventorywatcher
{
//定义发布者
inventorymanager invnetorymanager;
public inventorywatcher(inventorymanager inventorymanager)
{
console.writeline("[inventorywatcher.inventorywatcher] subscribing to inventorychange event/n");
this.invnetorymanager=inventorymanager;
//将自己connect到inventorymanager.inventorychangeeventhandler委托
inventorymanager.oninventorychangehandler+=new inventorymanager.inventorychangeeventhandler(oninventorychange);
}
//订阅者的方法,用于在发布者更新库存量时调用
void oninventorychange(object source,inventorychangeeventargs e)
{
int change=e.change;
console.writeline("[inventorymanager.oninventorychange]/n/tpart'{0}' was {1} by {2} units/n",e.sku,change>0?"increased":"decreased",math.abs(e.change));
}
}
/// <summary>
/// 用委托实现事件机制实例
/// </summary>
class delegateevents
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[stathread]
static void main(string[] args)
{
//定义委托发布者对象
inventorymanager inventorymanager=new inventorymanager();

console.writeline("[delegateevents.main instantiating subscriber object/n");
//定义订阅者对象
inventorywatcher inventwatcher=new inventorywatcher(inventorymanager);
inventorymanager.updateinventory("111 006 116",2);
inventorymanager.updateinventory("111 005 383",5);

console.readline();
}
}
}

以上只是自己的一点理解,很多地方都不成熟,可能举的例子也不恰当,欢迎指点,和大家共同学习



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表