C#委托——基础2

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

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

 1  public class CustomeEvebtArgs:EventArgs//参数类
 2     {
 3         string name = "";//员工姓名
 4         int number = 0;//所在办公室编号
 5         public CustomeEvebtArgs()
 6         {
 7         }
 8         public string Name
 9         {
10             get { return this.name; }
11             set { this.name = value; }
12         }
13         public int Number
14         {
15             get { return this.number; }
16             set { this.number = value; }
17         }
18     }

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

1      // 定义一个委托(打小报告的狐狸)
2     /// </summary>
3     /// <param name="sender">触发事件的源</param>
4     /// <param name="e">触发时间所携带的参数</param>
5     public delegate void DelegateClassHandle(object sender,CustomeEvebtArgs e);

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

PlayGame(this,e) ;

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

 CustomeEvebtArgs e = new CustomeEvebtArgs();
           e.Name = _name;
           e.Number = _number;

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

 public void Notify(object sender,CustomeEvebtArgs e)
        {
            Console.WriteLine("报告老板,{0}在{1}玩游戏哦",e.Name,((Employee)sender).Number);
        }

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

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


static void penalty(object sender, CustomeEvebtArgs e)
{
Console.WriteLine("罚款100");
}

 

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

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

 

posted @ 2015-11-29 17:43  无线电静默  阅读(236)  评论(0编辑  收藏  举报