欢迎光临
我们一直在努力

天天学C#-委托-.NET教程,C#语言

建站超值云服务器,限时71元/月

对学过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();

}

}

}

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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 天天学C#-委托-.NET教程,C#语言
分享到: 更多 (0)

相关推荐

  • 暂无文章