网站首页 > 技术文章 正文
Delegate 委托类型用来定义和响应应用程序中的回调。
回调指的是可以作为参数传递给其他代码的一段可执行代码,普通代码是高层(应用程序)调用低层(系统函数、库函数),回调时则是低层函数调用高层函数。
.NET委托类型是一个类型安全的对象,指向可以以后调用的其他方法。.NET委托是内置支持多路广播和异步调用的对象。它允许内存中的对象进行双向对话。
我们可以在任何需要强类型委托的情况下指定一个代码语句(以及传入代码语句的参数),它是类型安全的。
委托包含三个信息:1.他所调用的方法名称;2.该方法的参数;3.该方法的返回值类型。
委托既可以指向静态方法,也可以指向实例方法。运行时动态调用其指向的方法。委托自己不执行,只是指向一个方法让其去执行。(需要实例化)
(例子: //委托(这个委托可以指向任意传入两个整数,返回一个整数的方法)
public delegate int daleAa(int a, int b);)
//使用委托,在实例的过程中传入方法(AA是一个类,jia是一个加法方法),直接使用方法名而不需要实例化创建对象是因为.NET提供了方法组转换。
daleAa da = new daleAa(AA.jia);
da(3, 4);
)
委托有三个核心的方法(CLR自动生成),Invoke(调用)用来以同步方式调用委托对象的每个方法,这里的同步指的是指调用者必须等待调用完成后才继续执行(应该是在后台自动调用??),BeginInvoke(异步调用)和EndInvoke(结束调用)能够在第二个执行线程上异步调用当前方法。
(例子: //这是单线程的操作(以线程阻塞做实验)
Console.WriteLine("");
daleAa a1 = new daleAa(AA.jia2);
int we1 = a1(10, 80);
Console.WriteLine("90=" + we1);
//多线程操作(异步调用委托),jia2也是加法,里面多一个线程阻塞
Console.WriteLine("");
daleAa a2 = new daleAa(AA.jia2);
//这两个委托的方法都是CLR动态生成的
IAsyncResult ifs = a1.BeginInvoke(10, 80, null, null);
//Console.WriteLine("主线程干别的事请,完成之后就需要等待次线程的完成,因为只有一句输出代码,所以效率并未提升");
while (!ifs.IsCompleted)
{
Console.WriteLine("用于判断异步操作是否已完成");
Thread.Sleep(1000);
}
//接收返回的值,让主线程偷走了一步
int we2 = a1.EndInvoke(ifs);
Console.WriteLine("90=" + we2);
)
(多路广播)一个委托对象可以维护一个可调用的列表而不是单独一个方法,给委托添加多个方法时,重载+=就可以(对委托对象使用+=操作符的时候,编译器会将该问题转换为一个对静态Delegate.Combine()方法的调用,-=操作符也是被重载过的,在这里是对Remove()的调用)。
(例子: //委托支持多路广播
da += AA.jian;
//当一个委托同时被多个方法调用时会先后执行多次,也就是说,这一次会得到两个值,先加的5+4=9,后减为5-4=1
da(5, 4);
//移除某个方法(此处为加法)
da -= AA.jia;
da(3, 8);
)
如果我们没有把委托成员变量定义为私有的,调用者就可以直接访问委托对象。这样调用者就可以把变量重新赋值为新的委托对象(也就是修改了当前调用的方法列表),也可以直接调用委托的调用列表。
猜你喜欢
- 2024-10-25 优秀后端都应该具备哪些开发好习惯
- 2024-10-25 分享50个让你代码更好的小建议(好用的代码)
- 2024-10-25 Spring AOP里的静态代理和动态代理,你真的了解吗?
- 2024-10-25 代码保护软件 VMProtect 用户手册之准备项目: 使用标记
- 2024-10-25 写代码有这些想法,同事才不会认为你是复制粘贴程序员
- 2024-10-25 用Java创建对象的5种不同方法(java创建对象的几种方式)
- 2024-10-25 DispatcherObject(dispatchertimer)
- 2024-10-25 WPF效果第二百一十篇之NPOI插入图片
- 2024-10-25 【译】ConfigureAwait FAQ(configgenerator翻译)
- 2024-10-25 C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)