惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - 小居工作室

七牛云存储客户端(本人开发,开源) 如鹏网 net高级技术 第二章 委托和事件(复习) 如鹏网 net高级技术 第一章 各种知识点(复习) 写个QuartzHelper类 Pdf File Writer 中文应用(PDF文件编写器C#类库) 如鹏网 静态Web开发 第五章:JQuery 如鹏网 静态Web开发 第四章:JSDom 如鹏网 静态Web开发 第三章:Javascript 如鹏网 静态Web开发 第二章:css 如鹏网 静态Web开发 第一章:html 如鹏网.Net三层架构 第四章代码生成器 如鹏网.Net三层架构 第三章MD5和NPOI使用 如鹏网.Net三层架构第二章登录和会员管理 如鹏网.Net三层架构第一章三层基础 如鹏网.Net高级技术9.XML文件操作 如鹏网.Net高级技术8.反射 如鹏网.Net高级技术6.正则表达式 如鹏网.Net高级技术5.泛型集合及键值对 如鹏网.Net高级技术3.值类型和引用类型 如鹏网.Net高级技术4.String特点及常用方法
如鹏网.Net高级技术7.委托、事件
小居工作室 · 2016-03-04 · via 博客园 - 小居工作室

该段课程中主要讲解委托和事件,

首先讲解:委托是什么及作用,还有匿名函数和lambda表达式,系统中的泛型委托、如何自定义泛型委托。

然后讲解事件,事件的原理,委托和事件的区别。

---------------------------------------------

1.委托是数据类型

  传一个方法当参数时,使用委托。

      存储方法类型的变量指向 某一个方法

     委托的定义:是一种数据类型,像类一样(从IL中看出)(可以声明委托类型的变量)。

  一般方法参数可以是int、string、类类型,如:

    void M1(int n){ } √

    void M2(string s){ } √

    void M3(Person p){ } √

    那么能不能把方法也作为参数进行传递?

      void M4(M1 method)

      {

         method();    

      } 

    使用普通变量的时候是直接取值,或赋值。而使用委托变量的时候,我们还可以直接调用。

    如何定义:根据现有方法来声明 存储该方法数据类型的变量

--------------------------------------------

委托的使用

  声明委托的方式: delegate 返回值类型 委托类型名(参数)

    比如delegate void Mydel(int n)

  注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是Mydel不是函数名,而是委托类型名

  存储什么样的方法就声明什么类型(方法参数与返回值)的委托。

  声明的委托是一种类型,就像int、Person一样,

    如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:Mydel f1;

  将委托类型变量指向函数 Mydel sp = new Mydel (SayHello),

    这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。

    整数可以用整数变量指向它,

    对象可以用对象变量指向它,

    函数也可以用委托变量指向它。

    和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。  

   将委托类型变量指向函数还可以简化成Mydel sp = SayHello,编译器帮我们进行了new。

     但是不能sp=PrintIt(),因为这样就成了函数调用。

  委托就是一种数据类型,用来存放方法的数据类型。

-------------------------------------------------------------------------------------

匿名方法

使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。

匿名方法就是没有名字的方法。

MyDelegate p = delegate(int s){s=10;};

匿名方法与lambda表达式最终编译为一个方法。

Where();

ToList();

-------------------------------------------------------------------------------------

委托深入

 

-------------------------------------------------------------------------------------

多播委托(委托链,委托的组合)

delegate void PWD(string s)

PWD d = new PWD(SayHello)+new PWD(ToLower)

 

多播委托如何处理返回值?

委托绑定多个方法后,其中一个方法执行发生异常后面的方法还会继续执行吗?不会!

一个重要的方法GetInvocationList();//返回一个Delegate[]类型。

组合的委托必须是同一个类型

相当于创建了一个按照组合的顺序依次调用的新委托对象。

委托的组合一般是给事件用的,用普通的委托的时候很少用

-------------------------------------------------------------------------------------

事件(通过委托实现的,委托才是事件能正常执行的核心内容)

 

案例:通过UserControl控件自己制作一个三连击按钮.并使用。

事件语法:event Mydelegate mdl;

 

加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值不可以冒充进行事件通知了。只能+=、-=!

-------------------------------------------------------------------------------------

委托与事件总结

委托的作用:

 

占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null。

事件的作用:

 

事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=或-=来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)

在自定义控件(自己编写控件的时候,会大量用到事件. 但是当这些事件 被触发以后,具体执行哪些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),具体调用的是哪个方法,由使用控件的人来决定(Click+=new 委托(方法名);))

 

-------------------------------------------------------------------------------------

委托和事件没有可比性,(可以理解为对委托变量的封装。),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。(举例子:三种实现事件方式的区别(直接用委托实现、用私有委托+公有方法模拟事件,直接用event事件实现))

因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。add、remove。

事件是用来阉割委托实例的。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。