委托和事件
委托和事件应用非常广泛,但对于接触C#不长的人来说并不容易。他就像一道门槛,过了这个槛的人觉得真的是太容易了;但很多人过这到槛都只能过一半。今天我就跟大家来分享下我对于委托和事件的看法。
声明一个委托很简单只要加上delegate关键字就可以声明委托,下面是无参委托和有参委托的声明
public delegate void FrisDelegate();
public delegate void ToDelegate(int a ,int b);
虽然声明一个委托很简单,但是我们要怎么去用他呢?下面我们先来看一个例子:
public class A
{
public void GetDelegate(EntrustDelegate buyEgg)
{
if(buyEgg!=null)
buyEgg();
}
}
public class B
{
public static void buyEggA()
{
Console.WriteLine("A去买");
}
public static void buyEggB()
{
Console.WriteLine("B去买");
}
}
public delegate void EntrustDelegate();
class D
{
static void Main(string []args)
{
EntrustDelegate a1,b2;
A a=new A();
a1=B.buyEggA;
b2=B.buyEggB;
a.GetDelegate(a1);
a.GetDelegate(b2);
Console.Read();
}
}
输出结果:
A去买
B去买
以上就是委托的用法,但我们还能不能优化呢?因为每绑定一个方法就要声明一个事件这样会很麻烦。
答案是可以的,下面我们就来看看优化后的代码:
public class A
{
public delegate void EntrustDelegate();
public event EntrustDelegate buyEgg;
public void GetDelegate()
{
if (buyEgg != null)
buyEgg();
}
}
public class B
{
public static void buyEggA()
{
Console.WriteLine("A去买");
}
public static void buyEggB()
{
Console.WriteLine("B去买");
}
}
class D
{
static void Main(string[] args)
{
A a = new A();
B b = new B();
a.buyEgg += B.buyEggA;
a.buyEgg += B.buyEggB;
a.GetDelegate();
a.buyEgg -= B.buyEggB;
a.GetDelegate();
Console.Read();
}
}
输出结果:
A去买
B去买
A去买
优化后的代码确实简结多了,但是“+=”有什么作用为什么不是用“=”呢?"-="又是干嘛?
“+=”是给事件注册方法,而“-=”是取消注册;而之所以不用“=”是因为我们把委托放在A类声明中用event声明了事件,所以我们注册事件时不能使用“=”。
如写的不对之处,欢迎指正!!!!