我对C#中事件委托的通俗看法 | |
在学C#之前,我看过《JAVA编程思想》,还有一些JAVA的入门级的书籍,其中对事件的讲解,总是用事件监听,事件适配器来举例, 所以我就一直认为,在C#中,RUNTIMING会一直监测每个控件的状态,如果有控件的状态发生改变和话,就会触发事件。 后来仔细看了一些例题之后,发现这个想法真的是很傻的。 其实,理解C#的事件原理,必须明白以下一点: 控件属性的改变,在它的类中,是由set来改变的,可以理解为由方法(method)来改变的,而不是简单的赋值。 举个例子来说明: class shape { private int cvalue; public shape() {cvalue = 0;} public int colorvalue { set{cvalue = value;} get{return cvalue;} } } class MainApp { static void Main(string[] argvs) { shape trigon = new shape(); trigon.colorvalue = 3; } } 假设,当trigon的属性colorvalue发生改变时,会激发一个ColorChange事件,如果当colorvalue变化时,我们需要它向用户发送一个信息,例如:MessageBox.Show("The Color is Changed!"),那么,通常做法是给shape定义一个事件(怎么样定义这里就不讲了)ColorValueChange,先假设已定义,所以: class MainApp { static void Main(string[] argvs) { shape trigon = new shape(); trigon.ColorChange += EventHandler(this.Shape_ColorValue); trigon.colorvalue = 3; } private void Shape_ColorValueChange(object sender, System.EventArgs e) { MessageBox.Show("The Color is Changed!"); } } 因此,当trigon的ColorValue被改变时,事件会被触发;上面的情况,和下面的代码,在结果上是等效的: class shape { private int cvalue; public shape() {cvalue = 0;} public int colorvalue { set{cvalue = value; MessageBox.Show("The Color is Changed!");} get{return cvalue;} } } class MainApp { static void Main(string[] argvs) { shape trigon = new shape(); trigon.colorvalue = 3; } } 但是,一但我们这样定义一个类,如果shape类的使用者不仅仅是想给用户一个信息,他还想达到其它目的话,这个办法就行不通了,所以C#就有了事件委托这个东东。 我是这样理解事件委托的:委托可以接受一个方法的引用作为参数,然后执行这个方法。 所以,我们只要把MessageBox.Show("The Color is Changed!");换成事件委托就可以了,所以,shape类的使用者想要实现一个操作,他只要把他所要的操作定义成一个方法,再把这个方法通过委托,将其引用传给shape类的实例,让这个实例执行这个方法。 这种理解方法虽然不是很规范,但是,对理解C#的事件委托是很有帮助的,希望高手不要笑话。 下面让我们把shape类完整实现吧(现在就很好理解了): using System; namespace WinApp { //定义一个事件委托类型,注意不是事件 public delegate void ColorChangeEvent(object sender); public class shape { protected int cvalue; //根据事件委托类型构造一个事件 public event ColorChangeEvent ColorChange; public int colorvalue { set { cvalue = value; ColorChange(this);//在colorvalue的值发生改变后,触发事件。 } get { return cvalue; } } public shape() { cvalue = 0 ; } } } 下面是使用shape类的例子: . . . . private shape trigon = new shape(); /* 通过委托,将trigon_ColorChange方法的引用传递给shape的实例,一旦实例中执行了ColorChange, trigon_ColorChange方法就会被调用 */ this.trigon.ColorChange += new WinApp.ColorChangeEvent(this.trigon_ColorChange); . . . private void button1_Click(object sender, System.EventArgs e) { this.trigon.colorvalue = 3; } private void trigon_ColorChange(object sender) { MessageBox.Show("The Color is Changed!"); } . . . |
我对C#中事件委托的通俗看法
最新推荐文章于 2021-04-27 18:57:06 发布