一直都听说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
 

最新文章

  1. .NET轻量级RPC框架:Rabbit.Rpc
  2. Sass学习之路(3)——Sass编译
  3. vmware虚拟机挂起后无法再恢复(转)
  4. Jquery入门之----------选择器-------------
  5. (转)Qt Model/View 学习笔记 (三)——Model类
  6. leetcode@ [34] Search for a Range (STL Binary Search)
  7. demo_07选择器练习
  8. UNDO表空间损坏,爆满,ORA-600[4194]/[4193]错误解决
  9. 配置并学习微信JS-SDK(2)—扫一扫接口http://www.qq210.com/shoutu/android
  10. (黑客游戏)HackTheGame1.21 过关攻略
  11. poj3696:同余方程,欧拉定理
  12. asp.net2.0安全性(1)--用户角色篇(代码实现2)--转载来自车老师
  13. Linux下系统如何监控服务器硬件、操作系统、应用服务和业务
  14. vs2010 2013 2015 有用各种功能插件
  15. scrapy笔记
  16. js 判断浏览器型号
  17. day_6.21web框架编写
  18. cycript使用
  19. Selenium基础知识(九)验证码
  20. C++(二十七) — 深拷贝、浅拷贝、复制构造函数举例

热门文章

  1. atheros无线驱动之:数据接收流程
  2. ASP.NET MVC BundleConfig介绍和使用
  3. spark[源码]-SparkEnv执行环境创建
  4. TOSCA自动化测试工具ppt(正在整理)
  5. https://www.cnblogs.com/skywang12345/category/455711.html
  6. 前端JS复制特定区域的文本(兼容safari)
  7. ABP官方文档翻译 1.1 介绍
  8. css 中 transition 需要注意的问题
  9. 【读书笔记】《深入浅出nodejs》第五章 内存控制
  10. Material Design学习之 Camera