天天学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();
}
}
}
以上只是自己的一点理解,很多地方都不成熟,可能举的例子也不恰当,欢迎指点,和大家共同学习