【.NET基础】--委托、事件、线程(1)
2015-06-11 16:46
246 查看
1,委托 是存放方法的指针的清单,也就是装方法的容器
A, 新建winform项目【01委托】,项目中添加dg_SayHi.cs 委托类 用于存储方法namespace _01委托 { //定义委托 【类】 delegate void dg_SayHi(); }
B, Winfrom中添加按钮 "委托",按钮事件“btnDelegate_Click”中新建委托对象,并添加、移除 方法:
/// <summary> /// 点击按钮事件 /// </summary> private void btnDelegate_Click(object sender, EventArgs e) { //委托是方法的容器,可以在委托对象中添加、移除方法 ///创建委托对象,并通过构造函数添加SayHiCN方法 dg_SayHi objSayHi = new dg_SayHi(SayHiCN); //向委托对象中 "添加" 一个方法 objSayHi += SayHiEN; //从委托对象中 "移除" 一个方法 objSayHi -= SayHiCN; //调用委托,委托是方法的容器 ,调用委托的时候委托里面的方法都会被调用 objSayHi(); } void SayHiCN() { MessageBox.Show("你好上海"); } void SayHiEN() { MessageBox.Show("hi shanghai"); } }
C,点击“委托”,查看效果:
private void BtnDelegateAsPara_Click(object sender, EventArgs e) { int[] arr = { 1, 2, 5, 6, 7, 12 }; Person[] perArr = { new Person {Name="甜馨",Age=2}, new Person {Name="奥莉",Age=3}, new Person {Name="嗯哼",Age=1} }; //我们用写好的委托方法再次实现 比较大小 dg_GetMax<int> dg_GetMaxInt = new dg_GetMax<int>(Compare); int numMax = GetMax(arr, dg_GetMaxInt); dg_GetMax<Person> dg_GetMaxPer = new dg_GetMax<Person>(Compare); Person per = GetMax(perArr, dg_GetMaxPer); MessageBox.Show("最大数" + numMax.ToString()); MessageBox.Show(string.Format("最大年龄是:{0},年龄:{1}岁", per.Name, per.Age)); ////创建委托对象,并通过构造函数添加 GetMaxNum 方法 //dg_GetMaxAndMin objGetMax = new dg_GetMaxAndMin(GetMaxNum); //int numMax = objGetMax(arr); //传递参数数组 ////委托对象添加 GetMinNum 方法 //objGetMax += GetMinNum; //int numMin = GetMinNum(arr); //传递参数数组 //MessageBox.Show("最大数" + numMax.ToString() + " 最小数" + numMin.ToString()); //MessageBox.Show(string.Format("最大年龄是:{0},年龄{1}岁", per.Name, per.Age)); }
View Code
F,运行查看效果:
--------【以上Demo下载】-----------
4,匿名方法介绍:
使用Delegate的时候,很多时候没有必要单独去定义好一个普通的方法(上面例子中的Compare方法),因为这个方法也就只有Delegate会用,而且只用一次,这时候就适合用匿名方法。//三,Compare方法改写为委托方法 ,可以把Compare改写为匿名方法 //int numMax = GetMax<int>(arr, Compare); int numMax = GetMax<int>(arr, delegate(int a, int b) { int num = 0; if (a > b) { num = 1; } else if (a == b) { num = 0; } else if (a < b) { num = -1; } return num; }); //Person per = GetMax<Person>(perArr, Compare); Person per = GetMax<Person>(perArr, delegate(Person AA, Person BB) { int num = 0; if (AA.Age > BB.Age) { num = 1; } else if (AA.Age == BB.Age) { num = 0; } else if (AA.Age < BB.Age) { num = -1; } return num; });
5,委托Delegate编译以后就是一个类Class,这个类继承于 MulticastClass (多播委托)
我们用.NET Relfector反编译,查看委托实质:--------- ------------
A, 委托的实质是类,继承于多播委托MulticastDelegate,MulticastDelegate继承于System.Delegate类
B, objSayHi += SayHiEN; 这段代码的实质是: 把两个集合中的方法都存放到一个集合中,然后返回
///创建委托对象,并通过构造函数添加SayHiCN方法 dg_SayHi objSayHi = new dg_SayHi(SayHiCN); //向委托对象中 "添加" 一个方法 objSayHi += SayHiEN;
上面把方法添加到委托中,编译后就是下面的这样:
总结: 本文了解委托,并使用委托作为方法进行传递,又接触到了泛型和匿名方法,借助反编译器查看委托的实质。
【本文完整Demo下载】
参考:
返回委托中方法的值:http://m.blog.csdn.net/blog/lrz8745/7325056
/article/4782916.html
实用插件:Indent Guides 插件 代码中显示虚竖线
相关文章推荐
- pop动画使用示例
- HTTP权威指南之连接管理
- cocos2d-x中shader的使用
- 用pygame画一个圆
- RHEL7中防火墙firewalld的配置(1)
- Myclipse发布项目错误问题已解决
- URL编码
- 找不到git部署
- "重力锁屏"Beta版使用说明
- rowid 与 rownum 分页
- YUV422的旋转
- AndroidManifest.xml——activity(四)
- 指向指针的指针,彻底搞定C++指针
- 打破了中国电信华为无线路由猫(HG522-C)自己主动拨号+任意数量的计算机+iTV
- mysql复制表
- CentOS 运行ifconfig等命令, 提示command not foun
- Cookie/Session机制详解
- linux 中的几个命令
- 安装 CentOS 7 后必做的七件事
- 分享快速双边滤波matlab程序