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

[C#]委托实例分析(附源码)的更多相关文章

  1. 超详细的php用户注册页面填写信息完整实例(附源码)

    这篇文章主要介绍了一个超详细的php用户注册页面填写信息完整实例,内容包括邮箱自动匹配.密码强度验证以及防止表单重复等,小编特别喜欢这篇文章,推荐给大家. 注册页面是大多数网站必备的页面,所以很有必要 ...

  2. Django开发密码管理表实例【附源码】

    文章及代码比较基础,适合初.中级人员,高手略过 阅读此篇文章你可以: 获取一个Django实现增删改查的案例源码 了解数据加密的使用场景和方法以及如何在Python3中使用 背景介绍 DBA需要维护一 ...

  3. Android Studio 一个完整的APP实例(附源码和数据库)

    前言: 这是我独立做的第一个APP,是一个记账本APP. This is the first APP, I've ever done on my own. It's a accountbook APP ...

  4. leaflet 结合 d3.js 实现 geojson 数据地形剖面分析(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  5. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  6. 我的SSH框架实例(附源码)

    整理一下从前写的SSH框架的例子,供新人学习,使用到了注解的方式. 源码和数据库文件在百度网盘:http://pan.baidu.com/s/1hsH3Hh6 提取码:br27 对新同学的建议:最好的 ...

  7. Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)

    在使用Entity Framework加载关联实体时,可以有三种方式: 1.懒加载(lazy Loading); 2.贪婪加载(eager loading); 3.显示加载(explicit load ...

  8. Cesium专栏-空间分析之剖面分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  9. Cesium-空间分析之通视分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

随机推荐

  1. 63. Unique Paths II(有障碍的路径 动态规划)

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  2. atheros无线驱动之:数据接收流程

    1:数据处理函数tasklet,workqueue在之前的初始化代码中的函数__ath_attach()中,有如下的代码: #ifndef ATH_SUPPORT_HTC#ifdef ADF_SUPP ...

  3. Akka in action (第一章 介绍Akka)

    在本章 概述Akka 了解Actors和Actor系统 Akka的适用范围 在第一章中,会介绍给你Akk的个方面,它能做什么,与现有的解决方案有那些不同.重点关注Akka有哪些功能和使用范围和强大的并 ...

  4. 十八般武艺之 Runloop

    嗯,runloop ,看过,用过.但是有时候突然被问到,总是不能很好的描述给他人,也许是程序员本来口拙的缘故吧.另外,也是对runloop还是理解的不够透彻. 于是乎,决定重新整理一下,加深一下印象. ...

  5. vmware 虚拟机三种网卡

    转:https://blog.csdn.net/lyf_ldh/article/details/78695357 vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NA ...

  6. 【Thinking in Java, 4e】控制流程执行

    p46~p75: [迭代] 1.Java不允许将数字作为布尔值用. 1.有点意思的小程序WhileTest. public class WhileTest { static boolean condi ...

  7. nginx之proxy、cache、upstream模块学习

    nginx之proxy反向代理模块: location ^~ /proxy_path/ { root "/www/html"; 这里没必要配置 index index.html; ...

  8. 20145335《java程序设计》第三次实验报告

    20145335郝昊<java程序设计>第三次实验报告 实验目的与要求 以结对编程的方式编写一个软件,Blog中要给出结对同学的Blog网址,可以拍照展现结对编程 情况,可以参考一下其他学 ...

  9. ssh-keygen 的 详解

    为了让两个Linux机器之间使用ssh不需要用户名和密码.所以采用了数字签名RSA或者DSA来完成这个操作. 模型分析 假设 A (192.168.20.59)为客户机器,B(192.168.20.6 ...

  10. 如何使用curl进行网页授权

    答:使用curl的-u选项,使用方法如下 curl -u username URL (会提示输入密码)