委托是什么?
它就是一“托儿”,你一旦上了它的贼船,那么后续的很多好戏就该轮番上演了!
为啥?因为这个“托儿”有一肚子的坏水在等着你呢(它代理的那些方法)!
另外,从好的方面讲,委托就是一尚方宝剑,可以当皇帝老子使!牛着呐!
下面举个例子来说明下:
首先定义一个委托:
public delegate void SomethingHappendEventHandler(ReorderEventArgs e);
看见没,它和普通方法有嘛区别?对了,就是多了一个delegate关键字!
另外,委托是啥类型?别跟我说你不知道!引用类型呗!相对应的就是值类型啦!
下一个要注意的就是参数了,ReorderEventArgs是何方神圣?看看!
public class ReorderEventArgs : EventArgs{
private int _quantity;
public ReorderEventArgs(int quantity)
{
_quantity = quantity;
}
public int QuantityOnHand
{
get { return _quantity; }
}
}
原来不过如此,只不过从EventArgs继承而来,EventArgs是啥?是默认的事件参数,由框架提供的,对于它
其实大家早就已经司空见惯了,是否感觉眼熟?对了,就是在这里看到过:
private void Form2_Load(object sender, EventArgs e) {}
现在我们定义好了一个委托,那么怎么让它发挥作用呢?
接下来,我们使用刚刚的委托来声明一个事件:
public event SomethingHappendEventHandler SomethingHappened;
这里换了一个关键词,原来delegate的位置换成了event!还有一点变化,是什么?
SomethingHappened是不是没有参数?对的,它的参数其实在SomethingHappendEventHandler
中进行定义了,SomethingHappened其实就是一个委托类型,下面来定义一个响应该事件的方法:
private void x_SomethingHappened(ReorderEventArgs e)
{
Console.WriteLine("QuantityOnHand's value is {0}", e.QuantityOnHand);
}
现在有了一个方法,那么怎么让它响应SomethingHappened事件呢?自然,需要注册一下:
在一个合适的位置,比如构造函数,FormLoad事件、PageLoad事件等地方:
this.SomethingHappened += x_SomethingHappened;
在c#使用+=运算符即可为事件注册一个监听方法,很方便。
那么,万事俱备似乎只欠东风了,这东风是啥?当然是激活事件了:
public void RaiseEvents(){
ReorderEventArgs args=new ReorderEventArgs(100);
SomethingHappened(args);
}
好了,如你所愿,事件激活了,监听的方法也发现新大陆似的立马积极的给予了响应!
最后,咱总结下,委托是who?这事件又是who?委托和事件到底是what关系?学这个啥用?
你如果在一个按钮上双击一下,vs会自动给你创建一个事件处理程序,如下:
private void button1_Click(object sender, EventArgs e){
timer1.Enabled = true;
}
那么,有没有想过为什么在这里写代码系统就会响应Click事件呢?秘密就在vs悄悄的帮你生成的代码文件中,
一个叫做xx.designer.cs文件中,多了这样一句话:
this.button1.Click += new System.EventHandler(this.button1_Click);
看清楚了吧,其实button1_Click这个方法被vs悄悄的注册给系统预定义事件Click了,这个事件是谁的?button1的!
一切又回到了原点,是否对基于事件编程的原理有拨云见日的感觉?哈哈,快去改造你自己的程序去吧!