对于c#的程序员来说,事件和委托可能是一道坎,过去的人觉得很简单,没过去的人觉得这个堵得慌 ,每次用着都很难受。本人就是那个用着很难受的那个,做为一个百折不挠的程序员 我借鉴了网上一位前辈的代码,加上自己的理解来谈谈事件和委托。、、
先介绍一个场景,用历史的鸿门宴来说吧, 首领A要请敌人吃饭,同时队伍B,队伍C埋伏在两边,若首领 A 举左手,则B队杀出 攻击敌人
若首领A举右手 则C队杀出 攻击敌人。 若摔杯 则B,C同时杀出。
看到这个场景,我之前都会想,这个很简单啊
if(首领A举左手)
队伍B攻击
else if(首领B举右手)
队伍C攻击
else
队伍B,C同时攻击
但是问题来了, 我不知道首领何时举杯,也不可能一直循环等待首领举杯,还有如果首领觉得队伍不够,还要添加队伍D,队伍E。。。以及更多的队伍呢? 那么程序的可扩展性就不好了,这个时候事件就能完美的解决这些问题。
首先 我们来定义首领A
public class A
{
//定义举手动作
public void Raise(string Hand)
{
Console.WriteLine("首领举了{0}手",Hand);
}
//定义摔杯动作
public void Fall()
{
Console.WriteLine("首领摔杯了");
}
}
接着 我们来定义队伍B
public class B
{
//攻击
public void Attack()
{
Console.WriteLine("部下B发起了攻击");
}
}
定义队伍C
public class C
{
//攻击
public void Attack()
{
Console.WriteLine("部下C发起了攻击");
}
}
到这里 首领A,队伍B,队伍C 他们各自的动作就已经定义好了 ,队伍B和队伍C现在只需要等待首领A发出信号,然后一举全歼敌人
这个时候 事件的作用就体现出来了
首先 首领A可以定义两个事件,举杯事件和摔杯事件,
//首领举杯事件
public event Action<string> RaiseEvent;
//首领摔杯事件
public event Action FallEvent;
而队伍B和队伍C只需要各自订阅首领A的事件,就可以根据首领A发出的动作做出相应的攻击
具体代码如下:
首先是首领A:
public class A
{
//首领举杯事件
public event Action<string> ;
//首领摔杯事件
public event Action FallEvent;
//定义举手动作
public void Raise(string Hand)
{
Console.WriteLine("首领举了{0}手",Hand);
if (RaiseEvent != null)
RaiseEvent(Hand);
}
public void Fall()
{
Console.WriteLine("首领摔杯了");
if (FallEvent != null)
FallEvent();
}
}
接着是队伍B的
public class B
{
A a;
public B(A a)
{
this.a = a;
a.RaiseEvent +=new Action<string>(a_RaiseEvent);
a.FallEvent += new Action(a_FallEvent);
}
//首领举左手
public void a_RaiseEvent(string Hand)
{
if (Hand == "左")
Attack();
}
//首领摔杯
public void a_FallEvent()
{
Attack();
}
//攻击
public void Attack()
{
Console.WriteLine("部下B发起了攻击");
}
}
最后是队伍C的
public class C
{
A a;
public C(A a)
{
this.a = a;
a.RaiseEvent += new Action<string>(c_RaiseEvent);
a.FallEvent += new Action(c_FallEvent);
}
//首领举右手
public void c_RaiseEvent(string Hand)
{
if (Hand == "右")
Attack();
}
//首领摔杯
public void c_FallEvent()
{
Attack();
}
public void Attack()
{
Console.WriteLine("部下C发起了攻击");
}
}
最后对程序的调用
static void Main(string[] args)
{
A a = new A();
B b = new B(a);
C c = new C(a);
a.Raise("左");
a.Raise("右");
a.Fall();
Console.ReadLine();
}
事件总体来说是一中特殊的委托,在这个场景中,首领A定义事件,队伍B,队伍C把订阅事件,最后达到根据首领A的动作队伍B,C做出相应的动作。