您的位置:首页 > 编程语言 > C#

C#委托——基础2

2015-11-29 17:43 495 查看
  在上一篇随笔中,简要说明了怎样定义委托,定义事件,订阅事件,最后也实现了效果,就是当员工类的某个对象,执行某个事件时,委托事件被触发,后面也得到了结果,但是想象一下实际场景中,如果办公室有员工玩游戏了,这个时候,我们要找到是谁,在哪个位置玩游戏,而不是向所有人广播有人玩游戏了,这样并没有什么意义。因此,需要对上篇的代码进行改进,所以就要想办法传递参数,参数中需要包含必要的信息。

  在本例中,关于参数,首先创建了一个参数类,CustomeEvebtArgs且继承自EventArgs(这个我看的例子人家就是这样说的“是包含事件数据的类的基类”)

publicclassCustomeEvebtArgs:EventArgs//参数类
{
stringname="";//员工姓名
intnumber=0;//所在办公室编号
publicCustomeEvebtArgs()
{
}
publicstringName
{
get{returnthis.name;}
set{this.name=value;}
}
publicintNumber
{
get{returnthis.number;}
set{this.number=value;}
}
}


用这个参数类的对象去保存相关信息。而此时此刻,员工类就应当对应有姓名和座位号了,代码同上。

//定义一个委托(打小报告的狐狸)
///</summary>
///<paramname="sender">触发事件的源</param>
///<paramname="e">触发时间所携带的参数</param>
publicdelegatevoidDelegateClassHandle(objectsender,CustomeEvebtArgse);


此时,委托事件函数就应当带有定义委托时的上述两个参数了

PlayGame(this,e);


这个时候this代表的是该实例,也就是触发委托事件的实例。e则是该实例中的参数信息,其中e的初始化如下:

CustomeEvebtArgse=newCustomeEvebtArgs();
e.Name=_name;
e.Number=_number;


只要定义员工对象初始化后,被初始化的信息就作为参数被传递

publicvoidNotify(objectsender,CustomeEvebtArgse)
{
Console.WriteLine("报告老板,{0}在{1}玩游戏哦",e.Name,((Employee)sender).Number);
}


注意:处理事件的函数其函数前面一定要和委托定义时相同,如上所示。而上面的参数也可以用多种方式,既可以用参数类对象的属性表示,也可以用触发事件的实例的属性表示。



当然事件被触发后,也可以被多个函数处理,比如添加一个“罚工资”的函数


staticvoidpenalty(objectsender,CustomeEvebtArgse)
{
Console.WriteLine("罚款100");
}



这样只需我的委托函数关联上该函数即可

e.PlayGame+=newDelegateClassHandle(penalty);这里我没有重新创建一个类,而是直接将该函数作为静态函数,让委托直接调用函数名,而在定义该函数时不要忘了和定义委托时要有同样的参数

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: