梳理delegate相关概念
一、前言
可能项目规模较小,项目中除了增删改查就只剩下业务流程,以前都没怎么弄明白的东西时间长了就越发的模糊了...
二、使用场景
MSDN:delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。
- 匿名方法
static void Main(string[] args)
{
TestAnonymousMethod(delegate(string i) { return Convert.ToInt32(i); });
} static int TestAnonymousMethod(Func<string, int> func)
{
return func("");
} - 委托类型
//定义委托类型
delegate bool CompareDelegate(int i, int j); static void Main(string[] args)
{
//声明对象
//CompareDelegate cd = new CompareDelegate(Compare);
CompareDelegate cd = Compare;
Console.WriteLine(cd(, )); TestDelegate(Compare);
} //与委托类型签名相同的方法
static bool Compare(int i, int j)
{
return i > j;
} //委托声明方法形参,将方法以参数传递
static void TestDelegate(CompareDelegate cd)
{
Console.WriteLine(cd(, ));
} - event修饰委托(写这篇博客就是为了这一个节点...)
MSDN:event 关键字用于在发行者类中声明事件。事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。 如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。
曾今天真的以为delegate与event是同级别的关键词,直到昨天整理资料才恍然大悟,delegate跟event半毛钱关系都没有。delegate相当于关键字class,使用关键字delegate定义委托类型,然后使用委托类型声明委托变量,声明变量时可用event修饰。class Program
{
delegate bool CompareDelegate(int i, int j); static void Main(string[] args)
{
Publisher p = new Publisher();
p.Sample = Method;
p.Sample += Method; //注册第二个方法 //event仅可在声明它的类或结构使用=注册事件,防止外部注册事件时不小心覆盖了其他地方注册的事件方法
p.SampleEvent += Method;
p.RaiseSampleEvent(); //event修饰后的委托只能在声明它的类或结构中调用,没有event修饰的的委托可在外部调用
p.Sample("外部测试调用");
} static void Method(string msg)
{
Console.WriteLine(msg);
}
} public class Publisher
{
public delegate void SampleEventHandler(string msg); //不使用event修饰
public SampleEventHandler Sample; //使用event修饰
public event SampleEventHandler SampleEvent; public virtual void RaiseSampleEvent()
{
if (Sample != null)
{
Sample("不使用event修饰");
} if (SampleEvent != null)
{
SampleEvent("使用event修饰");
}
}
} - 异步委托
BeginInvoke 方法启动异步调用。该方法具有与你要异步执行的方法相同的参数,另加两个可选参数。第一个参数是一个AsyncCallback委托,此委托引用在异步调用完成时要调用的方法。第二个参数是一个用户定义的对象,该对象将信息传递到回调方法。 BeginInvoke 将立即返回,而不会等待异步调用完成。 BeginInvoke 返回可用于监视异步调用的进度的 IAsyncResult。
EndInvoke 方法用于检索异步调用的结果。它可以在调用 BeginInvoke 之后的任意时间调用。如果异步调用尚未完成,那么EndInvoke将阻止调用线程,直到完成异步调用。EndInvoke的参数包括您需要异步执行的方法的out和ref 参数以及由 IAsyncResult 返回的 BeginInvoke。static void Main(string[] args)
{
Console.WriteLine("主线程开始");
Action<string> act = msg =>
{
Thread.Sleep();
Console.WriteLine(msg);
};
//异步调用
IAsyncResult result = act.BeginInvoke("委托方法", null, null); Console.WriteLine("主线程。。。"); //异步调用完成返回
act.EndInvoke(result); Console.WriteLine("主线程结束");
}
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
Action<string> act = msg =>
{
Thread.Sleep();
Console.WriteLine(msg);
}; //异步调用,不阻塞进程
act.BeginInvoke("委托方法", ar =>
{
Action<string> handler = (Action<string>)((AsyncResult)ar).AsyncDelegate;
handler.EndInvoke(ar);
Console.WriteLine(ar.AsyncState);
}, "AsyncState:OK");
Console.WriteLine("主线程结束");
Thread.Sleep();
}
梳理delegate相关概念的更多相关文章
- [白话解析] 带你一起梳理Word2vec相关概念
[白话解析] 带你一起梳理Word2vec相关概念 0x00 摘要 本文将尽量使用易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来说,运用感性直觉的思考来帮大家梳理Word2vec相关概念. 0 ...
- [阿里DIN] 从模型源码梳理TensorFlow的乘法相关概念
[阿里DIN] 从模型源码梳理TensorFlow的乘法相关概念 目录 [阿里DIN] 从模型源码梳理TensorFlow的乘法相关概念 0x00 摘要 0x01 矩阵乘积 1.1 matmul pr ...
- js模块,类,继承,命名空间,私有属性等相关概念梳理
js确切的说是一种基于对象的语言,和纯面向对象的语言(比如as)稍微有点区别,js中没有类的概念.虽然有继承但是基于原型的继承.随着前段越来越受重视,jser们利用js的一些特性他们制造出了和纯面向对 ...
- 计算机基础理论知识梳理篇(三):VLAN与VLAN网卡相关概念
VLAN(Virtual Local Area Network) 虚拟局域网(VLAN,802.1Q)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能.部门及应用等因素将它们 ...
- java之Thread.sleep(long)与object.wait()/object.wait(long)的区别及相关概念梳理(good)
一.Thread.sleep(long)与object.wait()/object.wait(long)的区别sleep(long)与wait()/wait(long)行为上有些类似,主要区别如下:1 ...
- iOS面试必看,最全梳理
序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...
- iOS,面试必看,最全梳理
序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...
- iOS知识点全梳理-备用
感谢大神分享 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e26著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序言 ...
- iOS 面试常见问题最全梳理
序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...
随机推荐
- Sass用法指南
写在前面的话:随着CSS文件越来越大,内容越来越复杂,对其进行很好的维护将变的很困难.这时CSS预处理器就能够帮上大忙了,它们往往拥有变量.嵌套.继承等许多CSS不具备的特性.有很多CSS预处理器,这 ...
- ABP源码分析十六:DTO的设计
IDTO:空接口,用于标注Dto对象. ComboboxItemDto:用于combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用于na ...
- H3C交换机 配置IP映射
进入cmd 输入命令:telnet 192.168.x.x(交换机IP地址) 登陆后,更换用户"sys" 输入命令:dis cur(展示当前状态) 进入后按"空格&quo ...
- MVC视图展现模式之移动布局解析-续集
网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html demo:http://pan.baidu.com ...
- 【java】细说 JAVA中 标注 注解(annotation)
Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用 下面我们来详细说说这个注解,到底是怎么一 ...
- 从零开始编写自己的C#框架(21)——添加分类类型页面
页面权限与页面控件权限经过简单的调试后,终于启用起来了,以后大家添加新页面时,就必须按照本章介绍的方法,将你新增的页面注册到系统中,这样才能访问与进行相关操作. 下面讲讲如何创建一个分类类型的页面. ...
- C# Excel数据有效性
C# Excel数据有效性 在Excel中,我们可以使用数据有效性功能来定义哪些数据可以被输入到工作表的单元格中,例如,限制输入的数据为一定范围内的数字或使用下拉列表来限制用户可选择的数据等.这篇文章 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- J2EE 邮件发送那些事儿
距离自己写的关于java邮件发送的第一篇博客已经有很长一段时间了,现在回过头看看.虽然代码质量方面有待提高,整体结构也不怎样,但是基本思路和过程还是比较纯的.现在有空写写J2EE中邮件发送的开发,实际 ...
- ASP.NET Core 中文文档 第二章 指南(4.1)ASP.NET Core MVC 与 Visual Studio 入门
原文:Getting started with ASP.NET Core MVC and Visual Studio 作者:Rick Anderson 翻译:娄宇(Lyrics) 校对:刘怡(Alex ...