1.什么是委托
通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器
上传图片:

2.委托语法
准备一个方法:string Hello(string userName){}
string Hello2(string userName){}
声明委托类:delegate string DGSayHi(string userName);
创建委托对象:DGSayHi dgSay = new DGSayHi(Hello);
或 DGSsyHi dgSay = Hello;
追加方法:dgSay+=Hello2;
删除方法:dgSay -=Hello2;
调用委托:dgSay("你好");

3.多播委托
通常将包含多个方法指针的委托叫做多播委托
其实每个用户定义的委托类型编译后都是一个继承于多播委托的类,看源码:

上传图片:

4.委托的目的
(1)能将方法作为参数和返回值传递
(2)调用一个委托,执行N个方法(多播委托)

5.委托的缺点
不进行控制的缺点:可以使用Click=null来清除所有注册的事件,可以用Click()来假冒事件的触发。
解决方案,把委托成员做成private的,然后增加AddClickEventHandler、RemoveClickEventHandler两个public方法

6.什么是事件
对委托变量的可访问性进行控制封装
语法:public delegate void DGSayHi(string name);
public event DGSayHi dgSay;//创建事件委托(本质还是委托对象)
event会自动生成一个private delegate变量和两个函数: add和remove,C#编译器用这两个方法支持+=和-=操作符

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{public delegate void DGEach(int index,object item);public delegate void DGTest();internal class Program{public static void Test1(DGTest dgTest){dgTest(); //编译后:dgTest.Invoke();Console.WriteLine("Test1");}public static void Test2(){Console.WriteLine("Test2");}public static void Test3(){Console.WriteLine("Test3");}/// <summary>/// 委托当返回值/// </summary>/// <param name="strType"></param>/// <returns></returns>public static DGTest InvokeTest(string strType){switch (strType){case "2":return Test2;case "3":return Test3;default:return Test3;}}/// <summary>/// 使用委托模仿jQuery each方法/// </summary>/// <param name="list"></param>/// <param name="func"></param>public static void Each(ArrayList list, DGEach func){for (int i = 0; i < list.Count; i++){func(i, list[i]);}}private static void Main(string[] args){#region 委托当参数//DGTest dgTest = new DGTest(Test2);//或者    DGTest dgTest  = Test2;//Test1(dgTest);#endregion#region  委托当返回值//DGTest dgTest = InvokeTest("2");//dgTest();#endregion#region 完成 Each方法//ArrayList list = new ArrayList();//list.Add("刘德华");//list.Add("张学友");//list.Add("郭富城");//list.Add("黎明");// Each(list, delegate(int index,object item)// {//     Console.WriteLine(index+"---------"+item.ToString());// });#endregion#region 事件练习,一个设计模式的题目,说有三个对象,猫,老鼠,人,猫看见了老鼠,老鼠吓跑了,在过程中把人吵醒, 在编程过程中注意新的对象的参与Cat c = new Cat();c.Name = "tom";c.DGRunEventHandler += c_DGRunEventHandler;c.SeeMouse(c.Name);#endregion}private static void c_DGRunEventHandler(object sender,EventArgs e){Mouse m = new Mouse();m.Name = "mouse1";m.DGRunEventHandler += m_DGRunEventHandler;m.MouseRun(m);}private static void m_DGRunEventHandler(object sender, EventArgs e){Person p = new Person();p.WakeUp(sender);}}public class Cat{public event EventHandler DGRunEventHandler;public void SeeMouse(string name){Console.WriteLine(name+"看见老鼠");if (DGRunEventHandler != null){DGRunEventHandler(this,new EventArgs());}}public  string Name { get; set; }}public class Person{public void WakeUp(object sender){Console.WriteLine((sender as Mouse).Name+"老鼠跑,人醒了");}public string Name { get; set; }}public class Mouse{public event EventHandler DGRunEventHandler;public void MouseRun(object sender){Console.WriteLine((sender as Mouse).Name+"老鼠跑");if (DGRunEventHandler != null){DGRunEventHandler(this, new EventArgs());}}public string Name { get; set; }}
}

.net学习之委托和事件相关推荐

  1. C#委托与事件学习笔记

    今天跟随视频学习了一下C#中最重要的一些概念之委托与事件.老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的"每次见到委托和事件就觉得心里别(biè)得 ...

  2. C#学习(一):委托和事件

    预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...

  3. unity学习-委托(delegate),事件(event),Action,Func

    unity学习 委托 含义 定义 使用 事件 含义 使用 在进行项目的过程中,一直存在着对代码管理不当的问题,所以需要学习一些科学的代码思维,减少后期功能的修改与迭代引发的代码冗杂和内存爆炸 可以看b ...

  4. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

  5. [Unity] ACT 战斗系统学习 1:基于委托的事件管理器

    我觉得看视频太慢了,还是看别人源码更快-- 1.664235822/DarkSouls-Demo Github 源码: https://github.com/664235822/DarkSouls-D ...

  6. 对C#下函数,委托,事件的一点理解!

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 今天一来是有点 ...

  7. C#编程利器之四:委托与事件(Delegate and event) (上)

    本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...

  8. C#基础加强(8)之委托和事件

    委托 简介 委托是一种可以声明出指向方法的变量的数据类型. 声明委托的方式 格式: delegate <返回值类型> 委托类型名(参数) ,例如: delegate void MyDel( ...

  9. 如鹏网 net高级技术 第二章 委托和事件(复习)

    委托 委托是一种数据类型,可以声明委托类型变量. 委托是一种可以指向方法的数据类型. 声明委托的方式:delegate返回值类型 委托类型名(参数)   比如 delegate void MyDel( ...

最新文章

  1. WPF中对三维模型的控制
  2. GuozhongCrawler系列教程 (4) StartContext具体解释
  3. IBM RAS:高效存储的优化组合
  4. oracle中右击出现的含义,Oracle中经典的问题解决方案-Oracle
  5. c语言字符串加减_C语言中指针的介绍
  6. 31 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义结算在产品的记帐规则
  7. eclipse新建maven报错
  8. 易语言之编译后图标模糊的处理方案
  9. 微信小程序注册审核流程
  10. AutoRunner录制过程中发现对象录制不了
  11. oracle独占锁表禁止查询,oracle 锁表查询及解决、表字段查询
  12. 五笔爱好者的福音:新版本的陈桥五笔出来了(转)
  13. 使用JS将table表格导出为excel
  14. Unity中,区别LookAt与LookRotation
  15. python画五角星-Python的画五角星
  16. LCD12864 菜单部分编写
  17. QCon全球软件开发大会(北京站)将于4月25日开幕
  18. CPU卡内部认证与外部认证
  19. Redis TTL说明
  20. Collaborative Spatiotemporal Feature Learning for Video Action Recognition 论文笔记

热门文章

  1. 360怎么看电脑配置_Win10系统自带杀毒和垃圾清理好么?需不需要安装360卫士
  2. android 线性布局 底部,java – 如何在android线性布局中对齐父底部?
  3. 虹口区巡检机器人_上海巡检机器人
  4. mysql中备份和导出的区别_mysql的备份和导出
  5. 文明使用计算机 教案,四年级信息技术下册 文明在我身边教案 华中师大版
  6. JAVA ee6 result结果集_java对数据库的表插入操作时,显示已生成用于更新的结果集...
  7. python入门基础代码初学
  8. sap在线服务器,SAP服务器常用端口
  9. JS实现——俄罗斯方块
  10. 洛谷 P1663 山