一直都听说C#中的委托与事件非常重要,都没有什么切身的体会,而这次通过做一个WinForm二次开发的项目才真正感觉到了委托与事件的犀利之处。
1.C#中的事件和委托的作用?
事件代表一个组件能够被关注的一种信号,委托是可以把一个过程封装成变量进行传递并且执行的对象。
2.他们之间的关系?
委托是一种类型,事件是一种成员,就相当于public int Age {get;set;}这个属性中,int就是类型,Age是一个成员,public event EventHandler Push;这个事件中EventHandler就是委托类型,Push是事件,他是一个成员。
事件从本质上来说是委托,不过在使用上比委托多了一个限制:事件只能在定义事件的类内部被调用,而委托可以在任意方法中被调用(难就难在理解这句)。
我们基本上可以说:事件是委托,委托是方法指针,在调用委托的时候跟调用方法是一样的。一般来说,这个限制正好用在封装组件类的时候体现了封装特性。
3.和什么情况使用委托和事件?
事件是组件中的抽象概念,同样包括状态和操作也是组件中的概念,对应到C#里面就是属性和方法。所以像控件之类的组件都会有事件。而委托代表一个代码的执行过程,C#3.0引入linq以后,用的就非常频繁了。
4.但是用事件的方式来调用的话有什么好处?
事件是一种封装,就好像属性会封装字段一样,可以把定义和实现隔离开来,给你举个例子就是DateTime实际上你看那么多属性,其实里面只有一个字段存储时间,各种日期啊年啊属性都是根据这个时间算出来的。事件也把内部类型为一个委托的字段封装起来,这样在类的外部就只能使用事件来注册或者注销事件关注,而不能引发事件。
实例: 我们要达到这样的效果:
就是点击Form3中的数字选框时使Form1中的文本框联动
那么可以使用委托来完成:
第一步:在Form3.cs中定义委托与事件:
//定义带参数的委托与两个事件 //这是委托与事件的第一步 public delegate void Form2Handle(string s); public event Form2Handle changed;
第二步:在Form1.cs中将方法注册到委托上:
//改变值的事件 private void changed(string s) { //此处是给原有窗体中控件赋值 this.textBox1.Text = s + s; } private void button2_Click(object sender, EventArgs e) { Form3 frm3 = new Form3(); //这是委托与事件的第二步, //写到+=时,按两次Tab键会自动生成frm2_changed,frm3_empty两个事件 frm3.changed += new Form3.Form2Handle(changed);//改变值的事件 frm3.ShowDialog(); }
第三步:在Form3.cs中使用委托:
//这是委托与事件的第三步 //传值 changed(numericUpDown1.Value.ToString());
代码下载:委托与事件实例.rar